diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index e96783c..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dceb8c3..3641d30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,10 +15,10 @@ diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java new file mode 100644 index 0000000..9205841 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/HomeRecycleAdapter.java @@ -0,0 +1,81 @@ +package com.casic.birmm.hxrq.adapter; + +import android.content.Context; +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.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.Constant; + +import java.util.List; + + +public class HomeRecycleAdapter extends RecyclerView.Adapter { + + private Context context; + private List menusBeans; + + public HomeRecycleAdapter(Context context, List menus) { + this.context = context; + this.menusBeans = menus; + } + + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.item_home_recycleview, parent, false); + return new ItemViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + holder.bindView(position, menusBeans.get(position)); + if (clickListener != null) { + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + clickListener.onClick(position); + } + }); + } + } + + @Override + public int getItemCount() { + return menusBeans.size(); + } + + private OnGridItemClickListener clickListener; + + public interface OnGridItemClickListener { + void onClick(int position); + } + + public void setOnGridItemClickListener(OnGridItemClickListener onGridItemClickListener) { + this.clickListener = onGridItemClickListener; + } + + static class ItemViewHolder extends RecyclerView.ViewHolder { + + private ImageView imageView; + private TextView textView; + + ItemViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + + void bindView(int index, HomePageBean.DataBean.MenusBean menusBean) { + imageView.setBackgroundResource(Constant.ICONS[index]); + textView.setText(menusBean.getName()); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java new file mode 100644 index 0000000..900cdb0 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/adapter/MainPageAdapter.java @@ -0,0 +1,29 @@ +package com.casic.birmm.hxrq.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.util.List; + +public class MainPageAdapter extends FragmentPagerAdapter { + + private List fragmentList; + + public MainPageAdapter(@NonNull FragmentManager fm, List pages) { + super(fm); + this.fragmentList = pages; + } + + @NonNull + @Override + public Fragment getItem(int position) { + return fragmentList.get(position); + } + + @Override + public int getCount() { + return fragmentList.size(); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java index 6a741a6..e4c1fdd 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java +++ b/app/src/main/java/com/casic/birmm/hxrq/base/BaseFragment.java @@ -27,12 +27,15 @@ @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setupTopBarLayout(); initData(); initEvent(); } protected abstract int initLayoutView(); + protected abstract void setupTopBarLayout(); + protected abstract void initData(); protected abstract void initEvent(); diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java index d4f75b8..6c9f054 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/DataBean.java @@ -1,9 +1,10 @@ package com.casic.birmm.hxrq.bean; /** - * @Author: Pengxh + * @Author : Pengxh * @Time: 2021/4/12 9:36 * @Email: 290677893@qq.com + * @apiNote 手动适配人脸登录成功和失败返回值不统一的问题 **/ public class DataBean { diff --git a/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java new file mode 100644 index 0000000..2285d72 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/bean/HomePageBean.java @@ -0,0 +1,184 @@ +package com.casic.birmm.hxrq.bean; + +import java.util.List; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:08 + * @email : 290677893@qq.com + * @apiNote 首页九宫格 + **/ +public class HomePageBean { + + /** + * code : 200 + * data : {"menus":[{"children":"","code":"mars_maps","icon":"icon-overview","id":"1378889985741340674","ismenu":"0","levels":1,"name":"综合业务","num":0,"parentId":"0","resourceType":"02","url":"/marsMaps"},{"children":"","code":"storage_topic","icon":"icon-storage","id":"1381424116211712002","ismenu":"0","levels":1,"name":"储备专题","num":0,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/browse/2/0E694C686D254951A9EA992267127678"},{"children":"","code":"need_topic","icon":"icon-need","id":"1381488688993976322","ismenu":"0","levels":1,"name":"需求专题","num":1,"parentId":"0","resourceType":"02","url":"/needTopic"},{"children":"","code":"supply_topic","icon":"icon-supply","id":"1381488867180593154","ismenu":"0","levels":1,"name":"供应专题","num":2,"parentId":"0","resourceType":"02","url":"/supplyTopic"},{"children":"","code":"route_topic","icon":"icon-route","id":"1381490084849958914","ismenu":"0","levels":1,"name":"巡线专题","num":3,"parentId":"0","resourceType":"02","url":"/routeTopic"},{"children":"","code":"weather_topic","icon":"icon-weather","id":"1381489196995493890","ismenu":"0","levels":1,"name":"气象专题","num":4,"parentId":"0","resourceType":"02","url":"/weatherTopic"},{"children":"","code":"pipe_topic","icon":"icon-pipe","id":"1381489446082625538","ismenu":"0","levels":1,"name":"管网分布","num":5,"parentId":"0","resourceType":"02","url":"/pipeTopic"},{"children":"","code":"high_consequence","icon":"icon-heat","id":"1381489621647802369","ismenu":"0","levels":1,"name":"高后果区","num":6,"parentId":"0","resourceType":"02","url":"/highConsequence"},{"children":"","code":"construction","icon":"icon-construction","id":"1381489787964538882","ismenu":"0","levels":1,"name":"第三方施工","num":7,"parentId":"0","resourceType":"02","url":"/construction"},{"children":"","code":"vip_topic","icon":"icon-user","id":"1381491729608523778","ismenu":"0","levels":1,"name":"重点用户","num":8,"parentId":"0","resourceType":"02","url":"/vipTopic"},{"children":"","code":"water_threat","icon":"icon-alarm","id":"1381491576424153089","ismenu":"0","levels":1,"name":"水保隐患","num":8,"parentId":"0","resourceType":"02","url":"/waterThreat"},{"children":"","code":"sink_threat","icon":"icon-sink","id":"1381491920906534913","ismenu":"0","levels":1,"name":"塌陷专题","num":9,"parentId":"0","resourceType":"02","url":"/sinkThreat"},{"children":"","code":"winter_supply","icon":"statics","id":"1381492763781283841","ismenu":"0","levels":1,"name":"冬供专题","num":12,"parentId":"0","resourceType":"02","url":"/"},{"children":"","code":"data_middle_platform","icon":"icon-base","id":"1381421269856354305","ismenu":"0","levels":1,"name":"数据中台","num":19,"parentId":"0","resourceType":"02","url":"http://172.26.2.128:9001/freport/home"},{"children":"","code":"sys","icon":"icon-setting","id":"1189107859077373954","ismenu":"0","levels":1,"name":"系统设置","num":20,"parentId":"0","resourceType":"02","url":"/sys"}]} + * message : 请求成功 + * success : true + */ + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List menus; + + public List getMenus() { + return menus; + } + + public void setMenus(List menus) { + this.menus = menus; + } + + public static class MenusBean { + /** + * children : + * code : mars_maps + * icon : icon-overview + * id : 1378889985741340674 + * ismenu : 0 + * levels : 1 + * name : 综合业务 + * num : 0 + * parentId : 0 + * resourceType : 02 + * url : /marsMaps + */ + + private String children; + private String code; + private String icon; + private String id; + private String ismenu; + private int levels; + private String name; + private int num; + private String parentId; + private String resourceType; + private String url; + + public String getChildren() { + return children; + } + + public void setChildren(String children) { + this.children = children; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsmenu() { + return ismenu; + } + + public void setIsmenu(String ismenu) { + this.ismenu = ismenu; + } + + public int getLevels() { + return levels; + } + + public void setLevels(int levels) { + this.levels = levels; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getResourceType() { + return resourceType; + } + + public void setResourceType(String resourceType) { + this.resourceType = resourceType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java index a392c9b..f0a6ed8 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/AuthenticateModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.PublicKeyBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -26,7 +25,7 @@ @Override public Subscription sendRetrofitRequest() { - Observable observable = RetrofitServiceManager.authenticate(HttpConfig.PUBLIC_KEY_IP); + Observable observable = RetrofitServiceManager.authenticate(); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java index 8d00517..3269784 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/FaceLoginModelImpl.java @@ -2,7 +2,6 @@ import com.casic.birmm.hxrq.bean.FaceResultBean; import com.casic.birmm.hxrq.bean.ImageBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -35,7 +34,7 @@ @Override public Subscription sendRetrofitRequest(ImageBean image) { - Observable observable = RetrofitServiceManager.getFaceResult(HttpConfig.BASE_IP, image); + Observable observable = RetrofitServiceManager.getFaceResult(image); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java new file mode 100644 index 0000000..bc920e1 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/HomePageModelImpl.java @@ -0,0 +1,58 @@ +package com.casic.birmm.hxrq.mvp.model; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; + +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * @author : Pengxh + * @time : 2021/4/13 14:15 + * @email : 290677893@qq.com + **/ +public class HomePageModelImpl implements IHomePageModel { + + private OnGetPageResultListener listener; + + public HomePageModelImpl(OnGetPageResultListener onGetPageResultListener) { + this.listener = onGetPageResultListener; + } + + /** + * 数据回调接口 + */ + public interface OnGetPageResultListener { + void onSuccess(HomePageBean resultBean); + + void onFailure(Throwable throwable); + } + + @Override + public Subscription sendRetrofitRequest(String resourceType) { + Observable observable = RetrofitServiceManager.getHomePageResult(resourceType); + return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + if (listener != null) { + listener.onFailure(e); + } + } + + @Override + public void onNext(HomePageBean resultBean) { + if (resultBean != null) { + listener.onSuccess(resultBean); + } + } + }); + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java new file mode 100644 index 0000000..03ee9e3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/IHomePageModel.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.model; + +import rx.Subscription; + +public interface IHomePageModel { + Subscription sendRetrofitRequest(String resourceType); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java index 646dee2..b61fd9d 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/LoginActionModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.LoginResultBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -30,7 +29,7 @@ @Override public Subscription sendRetrofitRequest(String sid, String username, String key) { - Observable observable = RetrofitServiceManager.getTokenData(HttpConfig.BASE_IP, sid, username, key); + Observable observable = RetrofitServiceManager.getTokenData(sid, username, key); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java index 9f167d3..dbe5468 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/model/QrCodeModelImpl.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.mvp.model; import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.utils.HttpConfig; import com.casic.birmm.hxrq.utils.retrofit.RetrofitServiceManager; import rx.Observable; @@ -29,7 +28,7 @@ @Override public Subscription sendRetrofitRequest(String qrcodeId) { - Observable observable = RetrofitServiceManager.getQrScanResult(HttpConfig.BASE_IP, qrcodeId); + Observable observable = RetrofitServiceManager.getQrScanResult(qrcodeId); return observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() { @Override public void onCompleted() { diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java new file mode 100644 index 0000000..e3a55a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/HomePagePresenterImpl.java @@ -0,0 +1,38 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.mvp.BasePresenter; +import com.casic.birmm.hxrq.mvp.model.HomePageModelImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; + +public class HomePagePresenterImpl extends BasePresenter implements IHomePagePresenter, HomePageModelImpl.OnGetPageResultListener { + + private IHomePageView view; + private HomePageModelImpl actionModel; + + public HomePagePresenterImpl(IHomePageView homePageView) { + this.view = homePageView; + actionModel = new HomePageModelImpl(this); + } + + @Override + public void onReadyRetrofitRequest(String resourceType) { + addSubscription(actionModel.sendRetrofitRequest(resourceType)); + } + + @Override + public void disposeRetrofitRequest() { + unSubscription(); + } + + + @Override + public void onSuccess(HomePageBean pageBean) { + view.obtainHomePageResult(pageBean); + } + + @Override + public void onFailure(Throwable throwable) { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java new file mode 100644 index 0000000..f23aa38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/IHomePagePresenter.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.presenter; + +public interface IHomePagePresenter { + void onReadyRetrofitRequest(String resourceType); + + void disposeRetrofitRequest(); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java index aa03acf..38ec847 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/presenter/QrCodePresenterImpl.java @@ -17,7 +17,6 @@ @Override public void onReadyRetrofitRequest(String qrcodeId) { - view.showProgress(); addSubscription(actionModel.sendRetrofitRequest(qrcodeId)); } @@ -28,12 +27,11 @@ @Override public void onSuccess(QrCodeBean codeBean) { - view.hideProgress(); view.obtainQrCodeData(codeBean); } @Override public void onFailure(Throwable throwable) { - view.hideProgress(); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java new file mode 100644 index 0000000..f73ab79 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IHomePageView.java @@ -0,0 +1,7 @@ +package com.casic.birmm.hxrq.mvp.view; + +import com.casic.birmm.hxrq.bean.HomePageBean; + +public interface IHomePageView { + void obtainHomePageResult(HomePageBean resultBean); +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java index 4003e26..4e8821e 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java +++ b/app/src/main/java/com/casic/birmm/hxrq/mvp/view/IQrCodeDataView.java @@ -3,9 +3,5 @@ import com.casic.birmm.hxrq.bean.QrCodeBean; public interface IQrCodeDataView { - void showProgress(); - - void hideProgress(); - void obtainQrCodeData(QrCodeBean userBean); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java index 4109e3c..94d0d79 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/FacePreViewActivity.java @@ -3,10 +3,13 @@ import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.Color; import android.graphics.ImageFormat; import android.hardware.Camera; +import android.media.FaceDetector; import android.view.SurfaceHolder; import android.view.SurfaceView; +import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,15 +25,15 @@ public class FacePreViewActivity extends BaseActivity implements Camera.PreviewCallback { - private static final int preViewWidth = 720; - private static final int preViewHeight = 1280; + private static final String TAG = "FacePreViewActivity"; @BindView(R.id.surfaceView) SurfaceView surfaceView; + @BindView(R.id.faceTipsView) + TextView faceTipsView; private SurfaceHolder mSurfaceHolder; private Camera mCamera; private ImageHelper imageHelper; private Stack bitmapStack; - private boolean isCanLogin = true; @Override public int initLayoutView() { @@ -89,27 +92,22 @@ Camera.Size size = camera.getParameters().getPreviewSize();//必须是相机支持的预览尺寸,否则颜色YUV空间会错位 Bitmap originBitmap = imageHelper.nv21ToBitmap(data, size.width, size.height); //要使用Android内置的人脸识别,需要将Bitmap对象转为RGB_565格式,否则无法识别 -// Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); -// FaceDetector.Face[] faces = new FaceDetector.Face[1]; -// FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); -// int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); -// if (faceSum == 1) { - bitmapStack.push(originBitmap); - if (bitmapStack.size() >= 5) {//当栈里有5张bitmap之后才开始识别 - if (isCanLogin) { - isCanLogin = false; + Bitmap faceDetectorBitmap = originBitmap.copy(Bitmap.Config.RGB_565, true); + FaceDetector.Face[] faces = new FaceDetector.Face[1]; + FaceDetector faceDetector = new FaceDetector(faceDetectorBitmap.getWidth(), faceDetectorBitmap.getHeight(), 1); + int faceSum = faceDetector.findFaces(faceDetectorBitmap, faces); + if (faceSum == 1) { + faceTipsView.setText("已检测到人脸,识别中"); + faceTipsView.setTextColor(Color.GREEN); + bitmapStack.push(originBitmap); + if (bitmapStack.size() >= 3) {//当栈里有3张bitmap之后才开始识别 Bitmap bitmap = bitmapStack.pop(); Intent intent = new Intent(); intent.putExtra("imageToBase64", ImageHelper.imageToBase64(bitmap)); setResult(Activity.RESULT_OK, intent); finish(); - } else { - finish(); } } -// } else { -// Log.d(TAG, "detectorFace: 未检测到人脸"); -// } } /** @@ -134,7 +132,7 @@ mParameters.setPreviewFormat(ImageFormat.NV21); //设置预览图片的格式 //获取与指定宽高相等或最接近的尺寸 //设置预览尺寸 - Camera.Size bestPreviewSize = obtainBestSize(preViewWidth, preViewHeight, mParameters.getSupportedPreviewSizes()); + Camera.Size bestPreviewSize = obtainBestSize(surfaceView.getWidth(), surfaceView.getHeight(), mParameters.getSupportedPreviewSizes()); mParameters.setPreviewSize(bestPreviewSize.width, bestPreviewSize.height); //设置保存图片尺寸 // Camera.Size bestPicSize = obtainBestSize(picWidth, picHeight, mParameters.getSupportedPictureSizes()); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java index 3568f53..b7b09c4 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/LoginActivity.java @@ -1,7 +1,6 @@ package com.casic.birmm.hxrq.ui; -import android.content.DialogInterface; import android.content.Intent; import android.text.TextUtils; import android.util.Log; @@ -30,9 +29,10 @@ import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.ToastHelper; import com.casic.birmm.hxrq.utils.TokenHelper; +import com.casic.birmm.hxrq.widgets.InputDialog; import com.google.gson.Gson; +import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; @@ -53,6 +53,8 @@ QMUIRoundButton loginButton; @BindView(R.id.rememberPasswordView) CheckBox rememberPasswordView; + @BindView(R.id.changeServerConfigButton) + QMUIAlphaImageButton changeServerConfigButton; private QMUITipDialog loadingDialog; private AuthenticatePresenterImpl authenticatePresenter; @@ -106,9 +108,10 @@ loginPresenter = new LoginPresenterImpl(this); //人脸识别登录 faceLoginPresenter = new FaceLoginPresenterImpl(this); + changeServerConfigButton.setChangeAlphaWhenPress(true); } - @OnClick({R.id.loginButton, R.id.changeLoginModeView}) + @OnClick({R.id.loginButton, R.id.faceLoginView, R.id.changeServerConfigButton}) @Override public void onClick(View v) { switch (v.getId()) { @@ -116,26 +119,35 @@ //密码登录前需要验证sid authenticatePresenter.onReadyRetrofitRequest(); break; - case R.id.changeLoginModeView: - new QMUIDialog.MenuDialogBuilder(this) - .addItem("人脸登录", new DialogInterface.OnClickListener() { + case R.id.faceLoginView: + //调相机,捕获人脸数据 + startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); + break; + case R.id.changeServerConfigButton: + new InputDialog.Builder() + .setContext(this) + .setTitle("修改服务器地址和端口") + .setOnDialogClickListener(new InputDialog.OnDialogClickListener() { @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - captureFaceData(); + public void onConfirmClick(String serverValue, String portValue) { + if (!TextUtils.isEmpty(serverValue) && !TextUtils.isEmpty(portValue)) { + String serverConfig = "http:" + serverValue + ":" + portValue; + SaveKeyValues.putValue(Constant.IP_KEY, serverConfig); + ToastHelper.showToast("服务器地址修改成功", ToastHelper.SUCCESS); + } } - }).create().show(); + + @Override + public void onCancelClick() { + + } + }).build().show(); break; default: break; } } - private void captureFaceData() { - // 调相机,捕获人脸数据,并保存为文件得到路径 - startActivityForResult(new Intent(this, FacePreViewActivity.class), Constant.FACE_DETECTOR_CODE); - } - @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java index 23810c3..f8ef517 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/MainActivity.java @@ -1,36 +1,32 @@ package com.casic.birmm.hxrq.ui; -import android.graphics.Color; -import android.util.Log; -import android.view.View; +import android.view.MenuItem; -import androidx.core.content.ContextCompat; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager.widget.ViewPager; import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.MainPageAdapter; import com.casic.birmm.hxrq.base.DoubleClickExitActivity; -import com.casic.birmm.hxrq.bean.QrCodeBean; -import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; -import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; -import com.casic.birmm.hxrq.utils.ToastHelper; -import com.google.gson.Gson; +import com.casic.birmm.hxrq.ui.fragment.HomePageFragment; +import com.casic.birmm.hxrq.ui.fragment.MinePageFragment; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.qmuiteam.qmui.util.QMUIStatusBarHelper; -import com.qmuiteam.qmui.widget.QMUITopBarLayout; -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog; + +import java.util.ArrayList; +import java.util.List; import butterknife.BindView; -import cn.bertsir.zbar.Qr.ScanResult; -import cn.bertsir.zbar.QrConfig; -import cn.bertsir.zbar.QrManager; -import cn.bertsir.zbar.view.ScanLineView; -public class MainActivity extends DoubleClickExitActivity implements IQrCodeDataView { +public class MainActivity extends DoubleClickExitActivity { - @BindView(R.id.mainTopLayout) - QMUITopBarLayout mainTopLayout; - - private static final String TAG = "MainActivity"; - private QrCodePresenterImpl qrCodePresenter; - private QMUITipDialog loadingDialog; + @BindView(R.id.mainViewPager) + ViewPager mainViewPager; + @BindView(R.id.bottomNavigation) + BottomNavigationView bottomNavigation; + private MenuItem menuItem; + private List pageList; @Override public int initLayoutView() { @@ -41,85 +37,56 @@ protected void setupTopBarLayout() { //设置状态栏黑色字体图标 QMUIStatusBarHelper.setStatusBarLightMode(this); - mainTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(this, R.color.black)); - mainTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startScannerLogin(); - } - }); } @Override public void initData() { - //扫码登录 - qrCodePresenter = new QrCodePresenterImpl(this); - loadingDialog = new QMUITipDialog.Builder(this) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord("登陆中,请稍后") - .create(); + pageList = new ArrayList<>(); + pageList.add(new HomePageFragment()); + pageList.add(new MinePageFragment()); } @Override public void initEvent() { - - } - - private void startScannerLogin() { - QrConfig qrConfig = new QrConfig.Builder() - .setTitleText("扫码登录")//设置Title文字 - .setShowLight(true)//显示手电筒按钮 - .setShowTitle(true)//显示Title - .setShowAlbum(false)//显示从相册选择按钮 - .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 - .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 - .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 - .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) - .setDesText(null)//扫描框下文字 - .setShowDes(true)//是否显示扫描框下面文字 - .setPlaySound(true)//是否扫描成功后bi~的声音 - .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) - .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) - .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 - .setTitleTextColor(Color.WHITE)//设置Title文字颜色 - .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 - .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 - .setShowVibrator(true)//是否震动提醒 - .create(); - QrManager.getInstance().init(qrConfig).startScan(this, new QrManager.OnScanResultCallback() { + bottomNavigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override - public void onScanSuccess(final ScanResult result) { - qrCodePresenter.onReadyRetrofitRequest(result.content); + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + switch (item.getItemId()) { + case R.id.navigation_home: + mainViewPager.setCurrentItem(0); + break; + case R.id.navigation_mine: + mainViewPager.setCurrentItem(1); + break; + default: + break; + } + return false; } }); - } + mainViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - @Override - public void showProgress() { - loadingDialog.show(); - } + } - @Override - public void hideProgress() { - loadingDialog.hide(); - } + @Override + public void onPageSelected(int position) { + if (menuItem != null) { + menuItem.setChecked(false); + } else { + bottomNavigation.getMenu().getItem(0).setChecked(false); + } + menuItem = bottomNavigation.getMenu().getItem(position); + menuItem.setChecked(true); + } - @Override - public void obtainQrCodeData(QrCodeBean codeBean) { - Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); - if (codeBean.getCode() == 200) { - //验证成功登录 - ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); - } else { - ToastHelper.showToast("二维码已失效", ToastHelper.WARING); - } - } + @Override + public void onPageScrollStateChanged(int state) { - @Override - protected void onDestroy() { - super.onDestroy(); - if (qrCodePresenter != null) { - qrCodePresenter.disposeRetrofitRequest(); - } + } + }); + MainPageAdapter mainPageAdapter = new MainPageAdapter(getSupportFragmentManager(), pageList); + mainViewPager.setAdapter(mainPageAdapter); } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java new file mode 100644 index 0000000..6323a62 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/HomePageFragment.java @@ -0,0 +1,168 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.ImageView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.adapter.HomeRecycleAdapter; +import com.casic.birmm.hxrq.base.BaseFragment; +import com.casic.birmm.hxrq.bean.HomePageBean; +import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.mvp.presenter.HomePagePresenterImpl; +import com.casic.birmm.hxrq.mvp.presenter.QrCodePresenterImpl; +import com.casic.birmm.hxrq.mvp.view.IHomePageView; +import com.casic.birmm.hxrq.mvp.view.IQrCodeDataView; +import com.casic.birmm.hxrq.utils.ToastHelper; +import com.qmuiteam.qmui.widget.QMUITopBarLayout; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import cn.bertsir.zbar.Qr.ScanResult; +import cn.bertsir.zbar.QrConfig; +import cn.bertsir.zbar.QrManager; +import cn.bertsir.zbar.view.ScanLineView; + +/** + * 此页面后期可能需要添加滑动吸顶效果 + */ +public class HomePageFragment extends BaseFragment implements IHomePageView, IQrCodeDataView { + + private static final String TAG = "HomePageFragment"; + @BindView(R.id.homeTopLayout) + QMUITopBarLayout homeTopLayout; + + @BindView(R.id.userIconView) + ImageView userIconView; + @BindView(R.id.homeRecyclerView) + RecyclerView homeRecyclerView; + + private Context context; + private FragmentActivity activity; + private QrCodePresenterImpl qrCodePresenter; + private HomePagePresenterImpl homePagePresenter; + private List menusBeans; + + @Override + protected int initLayoutView() { + return R.layout.fragment_home; + } + + @Override + protected void setupTopBarLayout() { + context = getContext(); + activity = getActivity(); + homeTopLayout.setTitle("华新燃气").setTextColor(ContextCompat.getColor(context, R.color.white)); + homeTopLayout.setBackgroundColor(ContextCompat.getColor(context, R.color.homeBackColor)); + homeTopLayout.addRightImageButton(R.drawable.ic_scanning, 1).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startScannerLogin(); + } + }); + } + + @Override + protected void initData() { + //扫码登录 + qrCodePresenter = new QrCodePresenterImpl(this); + homePagePresenter = new HomePagePresenterImpl(this); + menusBeans = new ArrayList<>(); + } + + @Override + protected void initEvent() { + homePagePresenter.onReadyRetrofitRequest("02"); + } + + private void startScannerLogin() { + QrConfig qrConfig = new QrConfig.Builder() + .setTitleText("扫码登录")//设置Title文字 + .setShowLight(true)//显示手电筒按钮 + .setShowTitle(true)//显示Title + .setShowAlbum(false)//显示从相册选择按钮 + .setCornerColor(R.color.mainThemeColor)//设置扫描框颜色 + .setLineColor(R.color.mainThemeColor)//设置扫描线颜色 + .setLineSpeed(QrConfig.LINE_MEDIUM)//设置扫描线速度 + .setScanType(QrConfig.TYPE_QRCODE)//设置扫码类型(二维码,条形码,全部,自定义,默认为二维码) + .setDesText(null)//扫描框下文字 + .setShowDes(true)//是否显示扫描框下面文字 + .setPlaySound(true)//是否扫描成功后bi~的声音 + .setDingPath(R.raw.qrcode)//设置提示音(不设置为默认的Ding~) + .setIsOnlyCenter(true)//是否只识别框中内容(默认为全屏识别) + .setTitleBackgroudColor(R.color.black)//设置状态栏颜色 + .setTitleTextColor(Color.WHITE)//设置Title文字颜色 + .setScreenOrientation(QrConfig.SCREEN_PORTRAIT)//设置屏幕方式 + .setScanLineStyle(ScanLineView.style_hybrid)//扫描线样式 + .setShowVibrator(true)//是否震动提醒 + .create(); + QrManager.getInstance().init(qrConfig).startScan(activity, new QrManager.OnScanResultCallback() { + @Override + public void onScanSuccess(final ScanResult result) { + qrCodePresenter.onReadyRetrofitRequest(result.content); + } + }); + } + + @Override + public void obtainHomePageResult(HomePageBean resultBean) { + //加载首页九宫格 +// Log.d(TAG, "obtainHomePageResult: " + new Gson().toJson(resultBean)); + if (resultBean.isSuccess()) { + userIconView.setBackgroundResource(R.mipmap.launch_logo); + List menus = resultBean.getData().getMenus(); + //去掉数据中台、系统设置、填报 + for (HomePageBean.DataBean.MenusBean menusBean : menus) { + if (!menusBean.getName().equals("数据中台") && !menusBean.getName().equals("系统设置") && !menusBean.getName().equals("填报")) { + menusBeans.add(menusBean); + } + } + HomeRecycleAdapter adapter = new HomeRecycleAdapter(context, menusBeans); + homeRecyclerView.setLayoutManager(new GridLayoutManager(context, 3)); + homeRecyclerView.setAdapter(adapter); + adapter.setOnGridItemClickListener(new HomeRecycleAdapter.OnGridItemClickListener() { + @Override + public void onClick(int position) { + String url = menusBeans.get(position).getUrl(); + if (!TextUtils.isEmpty(url)) { + //TODO 跳转WebView加载H5 + Log.d(TAG, "onClick: " + url); + } else { + ToastHelper.showToast("", ToastHelper.WARING); + } + } + }); + } else { + ToastHelper.showToast("首页生成失败", ToastHelper.ERROR); + } + } + + @Override + public void obtainQrCodeData(QrCodeBean codeBean) { +// Log.d(TAG, "obtainQrCodeData: " + new Gson().toJson(codeBean)); + if (codeBean.getCode() == 200) { + //验证成功登录 + ToastHelper.showToast("登陆成功", ToastHelper.SUCCESS); + } else { + ToastHelper.showToast("二维码已失效", ToastHelper.WARING); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (qrCodePresenter != null) { + qrCodePresenter.disposeRetrofitRequest(); + } + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java new file mode 100644 index 0000000..d4050c8 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/ui/fragment/MinePageFragment.java @@ -0,0 +1,26 @@ +package com.casic.birmm.hxrq.ui.fragment; + +import com.casic.birmm.hxrq.R; +import com.casic.birmm.hxrq.base.BaseFragment; + +public class MinePageFragment extends BaseFragment { + @Override + protected int initLayoutView() { + return R.layout.fragment_mine; + } + + @Override + protected void setupTopBarLayout() { + + } + + @Override + protected void initData() { + + } + + @Override + protected void initEvent() { + + } +} diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java index 759a94d..ace7724 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/Constant.java @@ -2,12 +2,32 @@ import android.Manifest; +import com.casic.birmm.hxrq.R; + public class Constant { public static final String[] USER_PERMISSIONS = { Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + public static final int[] ICONS = { + R.drawable.ic_icon_overview, + R.drawable.ic_icon_storage, + R.drawable.ic_icon_need, + R.drawable.ic_icon_supply, + R.drawable.ic_icon_route, + R.drawable.ic_icon_weather, + R.drawable.ic_icon_pipe, + R.drawable.ic_icon_heat, + R.drawable.ic_icon_construction, + R.drawable.ic_icon_water, + R.drawable.ic_icon_user, + R.drawable.ic_icon_sink, + R.drawable.ic_statics + }; + + public static final String IP_KEY = "BASE_IP"; + public static final int PERMISSIONS_CODE = 999; public static final int FACE_DETECTOR_CODE = 998; } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java index 98d92d3..6ef5fe5 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/HttpConfig.java @@ -1,9 +1,5 @@ package com.casic.birmm.hxrq.utils; public class HttpConfig { - public static final String PUBLIC_KEY_IP = "http://111.198.10.15:11409"; - public static final String BASE_IP = "http://111.198.10.15:20403"; public static final long HTTP_TIMEOUT = 30L; - public static final String HTTP_TOKEN_KET = ""; - public static final int REQUEST_TOKEN_INVALID = 0; -} +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java index 1de1ff4..cf38aa2 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitService.java @@ -1,6 +1,7 @@ package com.casic.birmm.hxrq.utils.retrofit; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; @@ -21,7 +22,7 @@ /** * PublicKey校验 */ - @GET("/config/baseConfig") + @GET("/cockpit/config/baseConfig") Observable getPublicKey(); /** @@ -51,4 +52,14 @@ @POST("/cockpit/face/login") Observable getFaceLoginResult( @Body ImageBean imageBean); + + /** + * 获取首页九宫格数据 + *

+ * http://111.198.10.15:20403/cockpit/user/permission?resourceType=02 + */ + @GET("/cockpit/user/permission") + Observable getHomePage( + @Header("token") String token, + @Query("resourceType") String resourceType); } diff --git a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java index 4f618b6..ab251fb 100644 --- a/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/birmm/hxrq/utils/retrofit/RetrofitServiceManager.java @@ -3,11 +3,14 @@ import android.util.Log; import com.casic.birmm.hxrq.bean.FaceResultBean; +import com.casic.birmm.hxrq.bean.HomePageBean; import com.casic.birmm.hxrq.bean.ImageBean; import com.casic.birmm.hxrq.bean.LoginResultBean; import com.casic.birmm.hxrq.bean.PublicKeyBean; import com.casic.birmm.hxrq.bean.QrCodeBean; +import com.casic.birmm.hxrq.utils.Constant; import com.casic.birmm.hxrq.utils.HttpConfig; +import com.casic.birmm.hxrq.utils.SaveKeyValues; import com.casic.birmm.hxrq.utils.TokenHelper; import org.jetbrains.annotations.NotNull; @@ -24,9 +27,10 @@ public class RetrofitServiceManager { private static final String TAG = "RetrofitServiceManager"; - private static Retrofit createRetrofit(String baseUrl) { + private static Retrofit createRetrofit() { + String ip = (String) SaveKeyValues.getValue(Constant.IP_KEY, "http://111.198.10.15:20403"); return new Retrofit.Builder() - .baseUrl(baseUrl) + .baseUrl(ip) .addConverterFactory(GsonConverterFactory.create())//Gson转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(createOKHttpClient())//log拦截器 @@ -52,8 +56,8 @@ /** * 验证PublicKey */ - public static Observable authenticate(String baseUrl) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable authenticate() { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getPublicKey(); } @@ -61,8 +65,8 @@ /** * 登录并获取Token */ - public static Observable getTokenData(String baseUrl, String sid, String username, String key) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getTokenData(String sid, String username, String key) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.login(sid, username, key); } @@ -70,8 +74,8 @@ /** * 扫码登录结果 */ - public static Observable getQrScanResult(String baseUrl, String qrcodeId) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getQrScanResult(String qrcodeId) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getScannerLoginResult(TokenHelper.getToken(), qrcodeId); } @@ -79,9 +83,18 @@ /** * 人脸识别登录结果 */ - public static Observable getFaceResult(String baseUrl, ImageBean imageBean) { - Retrofit retrofit = createRetrofit(baseUrl); + public static Observable getFaceResult(ImageBean imageBean) { + Retrofit retrofit = createRetrofit(); RetrofitService service = retrofit.create(RetrofitService.class); return service.getFaceLoginResult(imageBean); } + + /** + * 获取首页九宫格数据 + */ + public static Observable getHomePageResult(String resourceType) { + Retrofit retrofit = createRetrofit(); + RetrofitService service = retrofit.create(RetrofitService.class); + return service.getHomePage(TokenHelper.getToken(), resourceType); + } } diff --git a/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java new file mode 100644 index 0000000..a40c05c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/hxrq/widgets/InputDialog.java @@ -0,0 +1,104 @@ +package com.casic.birmm.hxrq.widgets; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; + +import com.casic.birmm.hxrq.R; +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton; + +/** + * @Author: Pengxh + * @Time: 2021/4/13 13:18 + * @Email: 290677893@qq.com + **/ +public class InputDialog extends Dialog implements View.OnClickListener { + + private static final String TAG = "InputDialog"; + private String title; + private OnDialogClickListener listener; + private EditText serverView; + private EditText portView; + + private InputDialog(Builder builder) { + super(builder.mContext); + this.title = builder.title; + this.listener = builder.listener; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_input); + initView(); + } + + private void initView() { + TextView dialogTitle = findViewById(R.id.dialogTitle); + serverView = findViewById(R.id.inputServerView); + portView = findViewById(R.id.inputPortView); + QMUIRoundButton dialogCancelButton = findViewById(R.id.dialogCancelButton); + dialogCancelButton.setChangeAlphaWhenPress(true); + dialogCancelButton.setOnClickListener(this); + + QMUIRoundButton dialogConfirmButton = findViewById(R.id.dialogConfirmButton); + dialogConfirmButton.setChangeAlphaWhenPress(true); + dialogConfirmButton.setOnClickListener(this); + + if (!TextUtils.isEmpty(title)) { + dialogTitle.setText(title); + } + } + + @Override + public void onClick(View view) { + int i = view.getId(); + if (i == R.id.dialogCancelButton) { + if (listener != null) { + listener.onCancelClick(); + } + } else if (i == R.id.dialogConfirmButton) { + if (listener != null) { + String server = serverView.getText().toString().trim(); + String port = portView.getText().toString().trim(); + listener.onConfirmClick(server, port); + } + } + this.dismiss(); + } + + public static class Builder { + private Context mContext; + private String title; + private OnDialogClickListener listener; + + public Builder setContext(Context context) { + this.mContext = context; + return this; + } + + public Builder setTitle(String title) { + this.title = title; + return this; + } + + public Builder setOnDialogClickListener(OnDialogClickListener listener) { + this.listener = listener; + return this; + } + + public InputDialog build() { + return new InputDialog(this); + } + } + + public interface OnDialogClickListener { + void onConfirmClick(String serverValue, String portValue); + + void onCancelClick(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button.xml b/app/src/main/res/drawable/bg_button.xml new file mode 100644 index 0000000..84dbc9e --- /dev/null +++ b/app/src/main/res/drawable/bg_button.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_enter_bottom.png b/app/src/main/res/drawable/bg_enter_bottom.png new file mode 100644 index 0000000..6519fa0 --- /dev/null +++ b/app/src/main/res/drawable/bg_enter_bottom.png Binary files differ diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..c5cbeda --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_icon_all.xml b/app/src/main/res/drawable/ic_icon_all.xml new file mode 100644 index 0000000..72cc06c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_all.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_construction.xml b/app/src/main/res/drawable/ic_icon_construction.xml new file mode 100644 index 0000000..a7ca864 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_construction.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_disaster.xml b/app/src/main/res/drawable/ic_icon_disaster.xml new file mode 100644 index 0000000..b611e3f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_disaster.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_heat.xml b/app/src/main/res/drawable/ic_icon_heat.xml new file mode 100644 index 0000000..fb0e0d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_heat.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_need.xml b/app/src/main/res/drawable/ic_icon_need.xml new file mode 100644 index 0000000..aa5b984 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_need.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_overview.xml b/app/src/main/res/drawable/ic_icon_overview.xml new file mode 100644 index 0000000..4abad77 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_overview.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_people.xml b/app/src/main/res/drawable/ic_icon_people.xml new file mode 100644 index 0000000..02191d9 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_people.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_pipe.xml b/app/src/main/res/drawable/ic_icon_pipe.xml new file mode 100644 index 0000000..c2a56e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_pipe.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_route.xml b/app/src/main/res/drawable/ic_icon_route.xml new file mode 100644 index 0000000..2943d62 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_route.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_sink.xml b/app/src/main/res/drawable/ic_icon_sink.xml new file mode 100644 index 0000000..fe1bd1f --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_sink.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_storage.xml b/app/src/main/res/drawable/ic_icon_storage.xml new file mode 100644 index 0000000..3a350de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_storage.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_icon_supply.xml b/app/src/main/res/drawable/ic_icon_supply.xml new file mode 100644 index 0000000..eba82f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_supply.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_user.xml b/app/src/main/res/drawable/ic_icon_user.xml new file mode 100644 index 0000000..ca73a4c --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_user.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_icon_water.xml b/app/src/main/res/drawable/ic_icon_water.xml new file mode 100644 index 0000000..1f1f8de --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_water.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_icon_weather.xml b/app/src/main/res/drawable/ic_icon_weather.xml new file mode 100644 index 0000000..f016bd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_icon_weather.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 07d5da9..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_scanning.xml b/app/src/main/res/drawable/ic_scanning.xml index 5c094fa..d01e93d 100644 --- a/app/src/main/res/drawable/ic_scanning.xml +++ b/app/src/main/res/drawable/ic_scanning.xml @@ -4,6 +4,6 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..f1d8414 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_statics.xml b/app/src/main/res/drawable/ic_statics.xml new file mode 100644 index 0000000..8ccdbc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_statics.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_face.xml b/app/src/main/res/layout/activity_face.xml index 0d2e4e0..b6d8a43 100644 --- a/app/src/main/res/layout/activity_face.xml +++ b/app/src/main/res/layout/activity_face.xml @@ -21,5 +21,14 @@ android:layout_height="300dp" android:layout_gravity="center" android:background="@drawable/bg_circle_image" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 5e16fcb..57a8825 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -2,15 +2,15 @@ + android:layout_height="match_parent" + android:background="@color/white"> + android:background="@mipmap/hxrq" /> - + android:layout_alignParentBottom="true" + android:orientation="vertical"> - - + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 00a79de..e643ade 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,21 +1,25 @@ + android:orientation="vertical"> - + + + + - - - - - - + android:background="?android:attr/windowBackground" + app:itemIconTint="@drawable/bottom_text_color" + app:itemTextColor="@drawable/bottom_text_color" + app:labelVisibilityMode="labeled" + app:menu="@menu/bottom_nav_menu" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml new file mode 100644 index 0000000..905527b --- /dev/null +++ b/app/src/main/res/layout/dialog_input.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..19f4000 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..608b04e --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_home_recycleview.xml b/app/src/main/res/layout/item_home_recycleview.xml new file mode 100644 index 0000000..1e8cae9 --- /dev/null +++ b/app/src/main/res/layout/item_home_recycleview.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/line.xml b/app/src/main/res/layout/line.xml new file mode 100644 index 0000000..fd99e01 --- /dev/null +++ b/app/src/main/res/layout/line.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..397c5d3 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,23 @@ + +

+ + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index a571e60..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 61da551..0000000 --- a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index c41dd28..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index db5080a..0000000 --- a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/home.png b/app/src/main/res/mipmap-xhdpi/home.png new file mode 100644 index 0000000..556bd0b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/home.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/hxrq.jpg b/app/src/main/res/mipmap-xhdpi/hxrq.jpg new file mode 100644 index 0000000..f94c12d --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/hxrq.jpg Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 6dba46d..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index da31a87..0000000 --- a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/launch_logo.png b/app/src/main/res/mipmap-xhdpi/launch_logo.png new file mode 100644 index 0000000..63ab65b --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/launch_logo.png Binary files differ diff --git a/app/src/main/res/mipmap-xhdpi/mine.png b/app/src/main/res/mipmap-xhdpi/mine.png new file mode 100644 index 0000000..708bc09 --- /dev/null +++ b/app/src/main/res/mipmap-xhdpi/mine.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 15ac681..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index b216f2d..0000000 --- a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index f25a419..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index e96783c..0000000 --- a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 19c8103..00c06df 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -17,6 +17,7 @@ #278DF9 #E0DEDF - #058CFC + #51A3F9 #575757 + #288DF7