diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a66ce60 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,131 @@ +apply plugin: 'com.android.application' + +android { + compileSdk 33 + buildToolsVersion '33.0.0' + defaultConfig { + applicationId "com.rehome.meetingbook" + minSdkVersion 24 + targetSdkVersion 33 + versionCode 1 + versionName "1.0.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + //每个应用拥有不同的authorities,防止相同的在同一个手机上无法同时安装 + resValue "string", "authorities", applicationId + multiDexEnabled true + ndk { + abiFilters 'armeabi-v7a','arm64-v8a' + } + } + buildFeatures { + viewBinding = true + buildConfig = true + } + signingConfigs { + release { + keyAlias 'key0' + storeFile file('../key/keystore1') + storePassword 'abc123123' + keyPassword 'abc123123' + v1SigningEnabled true //是否开启V1签名 + v2SigningEnabled true //是否开启V2签名 + } + } + /* keypassword:abc123123 alias key0*/ + buildTypes { + debug { + minifyEnabled false + buildConfigField "boolean", "LOG_ERROR", "true" + } + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + buildConfigField("boolean","LOG_ERROR","true"); + } + release { + lintOptions { + checkReleaseBuilds false + abortOnError false + } + minifyEnabled false //开启代码混淆,防止反编译查看源代码 + zipAlignEnabled true // 对齐zip + debuggable false // 是否debug + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + buildConfigField "boolean", "LOG_ERROR", "false" + signingConfig signingConfigs.release // 打包签名信息 + //修改生成的apk名字 + android.applicationVariants.all { variant -> + variant.outputs.all { + outputFileName = "sbcksyy.apk" + } + }; + } + } + + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + } + } + namespace 'com.rehome.meetingbook' + compileOptions { + targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_17 + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation 'com.zhy:autolayout:1.4.5' + +// 网络请求------------------------------------------------------- + implementation 'com.yolanda.nohttp:nohttp:1.0.5' + implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + implementation 'com.hjq:http:9.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' + implementation 'com.hjq.gson:factory:2.2' + implementation 'cn.hutool:hutool-all:5.8.5' +// ---------------------------------------------------------------- + implementation 'com.hjq:toast:8.8' + implementation 'org.litepal.android:core:1.5.1' + implementation 'com.orhanobut:logger:2.2.0' + implementation 'com.yanzhenjie:permission:2.0.3' + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + implementation 'de.hdodenhof:circleimageview:3.1.0' + implementation 'com.github.chrisbanes.photoview:library:1.2.4' + implementation 'me.leolin:ShortcutBadger:1.1.22@aar' + implementation 'cn.jzvd:jiaozivideoplayer:7.2.3' + implementation 'com.google.zxing:core:3.4.1' + implementation 'com.github.barteksc:android-pdf-viewer:2.8.2' + implementation 'com.github.chrisbanes:PhotoView:2.1.3' + implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' + implementation 'com.haozhang.libary:android-slanted-textview:1.2' + implementation 'com.github.huangyanbin:SmartTable:2.2.0' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'com.github.xuexiangjys:XUI:1.1.5' + implementation 'com.haibin:calendarview:3.6.3' + implementation 'com.github.baoyachi:StepView:1.9' + implementation 'com.azhon:appupdateX:2.8.0' + implementation 'com.king.zxing:zxing-lite:1.1.6-androidx' + implementation 'com.tencent.bugly:crashreport:3.2.1' + implementation 'com.github.xuexiangjys.SmartRefreshLayout:refresh-header:1.1.5' + implementation 'com.github.xuexiangjys.SmartRefreshLayout:refresh-layout:1.1.5' + implementation 'com.just.agentweb:agentweb:4.1.4' + implementation 'com.lcodecorex:tkrefreshlayout:1.0.7' + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.9' + implementation 'com.github.bumptech.glide:glide:4.11.0' + //日历 + implementation 'com.haibin:calendarview:3.7.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + +} \ No newline at end of file diff --git a/app/libs/arm64-v8a/libwlt2bmp.so b/app/libs/arm64-v8a/libwlt2bmp.so new file mode 100644 index 0000000..dfc2829 Binary files /dev/null and b/app/libs/arm64-v8a/libwlt2bmp.so differ diff --git a/app/libs/arm64-v8a/libzkwltdecode.so b/app/libs/arm64-v8a/libzkwltdecode.so new file mode 100644 index 0000000..5d58b4d Binary files /dev/null and b/app/libs/arm64-v8a/libzkwltdecode.so differ diff --git a/app/libs/armeabi-v7a/libwlt2bmp.so b/app/libs/armeabi-v7a/libwlt2bmp.so new file mode 100644 index 0000000..0d0b852 Binary files /dev/null and b/app/libs/armeabi-v7a/libwlt2bmp.so differ diff --git a/app/libs/armeabi-v7a/libzkwltdecode.so b/app/libs/armeabi-v7a/libzkwltdecode.so new file mode 100644 index 0000000..a6c6543 Binary files /dev/null and b/app/libs/armeabi-v7a/libzkwltdecode.so differ diff --git a/app/libs/zkandroidcore.jar b/app/libs/zkandroidcore.jar new file mode 100644 index 0000000..df507bf Binary files /dev/null and b/app/libs/zkandroidcore.jar differ diff --git a/app/libs/zkandroididcardreader.jar b/app/libs/zkandroididcardreader.jar new file mode 100644 index 0000000..17bc9de Binary files /dev/null and b/app/libs/zkandroididcardreader.jar differ diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/rehome/meetingbook/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/rehome/meetingbook/ExampleInstrumentedTest.java new file mode 100644 index 0000000..61a2727 --- /dev/null +++ b/app/src/androidTest/java/com/rehome/meetingbook/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.rehome.meetingbook; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.rehome.sbcksyy", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..85bd12b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/App.java b/app/src/main/java/com/rehome/meetingbook/App.java new file mode 100644 index 0000000..a2f0716 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/App.java @@ -0,0 +1,100 @@ +package com.rehome.meetingbook; + + +import android.app.ActivityManager; +import android.content.Context; +import android.text.TextUtils; +import android.util.Log; +import androidx.multidex.MultiDex; +import com.github.mikephil.charting.utils.Utils; +import com.tencent.bugly.crashreport.CrashReport; +import com.xuexiang.xui.XUI; +import com.yolanda.nohttp.NoHttp; +import com.zhy.autolayout.config.AutoLayoutConifg; +import org.litepal.LitePalApplication; + + +public class App extends LitePalApplication { + + + private static final String APP_NAME = "com.rehome.sbcksyy"; + + private String DateSave; + + public String getDateSave() { + return DateSave; + } + + public void setDateSave(String dateSave) { + DateSave = dateSave; + } + + private static App mInstance; + public static App getInstance() { + return mInstance; + } + + + @Override + public void onCreate() { + super.onCreate(); + Log.e("BaseApplication", "onCreate"); + Log.e("BaseApplication", getProcessNameByPID(getApplicationContext(), android.os.Process.myPid())); + Log.e("isAppMainProcess", String.valueOf(isAppMainProcess())); + + mInstance = this; + + NoHttp.initialize(this); + MultiDex.install(this); + AutoLayoutConifg.getInstance().useDeviceSize(); + Utils.init(this); + XUI.init(this); //初始化UI框架 + CrashReport.initCrashReport(getApplicationContext(), "ef7c97c038", true); + + } + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + MultiDex.install(this); + } + + + /** + * 判断是否是主进程 + * + * @return + */ + public boolean isAppMainProcess() { + try { + int pid = android.os.Process.myPid(); + String process = getProcessNameByPID(getApplicationContext(), pid); + return TextUtils.isEmpty(process) || APP_NAME.equalsIgnoreCase(process); + } catch (Exception e) { + return true; + } + } + + /** + * 根据 pid 获取进程名 + * + * @param context + * @param pid + * @return + */ + public String getProcessNameByPID(Context context, int pid) { + ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + if (manager == null) { + return ""; + } + for (android.app.ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { + if (processInfo == null) { + continue; + } + if (processInfo.pid == pid) { + return processInfo.processName; + } + } + return ""; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/AppManager.java b/app/src/main/java/com/rehome/meetingbook/AppManager.java new file mode 100644 index 0000000..8c2270b --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/AppManager.java @@ -0,0 +1,103 @@ +package com.rehome.meetingbook; + + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; + +import java.util.Stack; + +public class AppManager { + + private static Stack activityStack; + + private static AppManager instance; + + private AppManager() { + } + + /** + * 单一实例 + */ + public static AppManager getAppManager() { + if (instance == null) { + instance = new AppManager(); + } + return instance; + } + + /** + * 添加Activity到堆栈 + */ + public void addActivity(Activity activity) { + if (activityStack == null) { + activityStack = new Stack(); + } + activityStack.add(activity); + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + public Activity currentActivity() { + Activity activity = activityStack.lastElement(); + return activity; + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + public void finishActivity() { + Activity activity = activityStack.lastElement(); + finishActivity(activity); + } + + /** + * 结束指定的Activity + */ + public void finishActivity(Activity activity) { + if (activity != null) { + activityStack.remove(activity); + activity.finish(); + activity = null; + } + } + + /** + * 结束指定类名的Activity + */ + public void finishActivity(Class cls) { + for (Activity activity : activityStack) { + if (activity.getClass().equals(cls)) { + finishActivity(activity); + } + } + } + + /** + * 结束所有Activity + */ + public void finishAllActivity() { + for (int i = 0, size = activityStack.size(); i < size; i++) { + if (null != activityStack.get(i)) { + activityStack.get(i).finish(); + } + } + activityStack.clear(); + } + + /** + * 退出应用程序 + */ + @SuppressWarnings("deprecation") + public void AppExit(Context context) { + try { + finishAllActivity(); + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + activityManager.restartPackage(context.getPackageName()); + System.exit(0); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/Contans.java b/app/src/main/java/com/rehome/meetingbook/Contans.java new file mode 100644 index 0000000..0dfe360 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/Contans.java @@ -0,0 +1,42 @@ +package com.rehome.meetingbook; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-01 15:16 + * 描述:常量工具类 + */ +public class Contans { + //APP登录接口url + //public static String BASE_URL = "http://192.168.2.215:8082/"; + //厂内 + public static String BASE_URL = "http://10.19.0.73:8082/"; + + + + + //获取历史练习数据 + public static String GET_APPOINTMENT_SUCCESS_URL="CBS/Api/YYGL/GetYYKSJGList.ashx?sfzh="; + //获取预约等级和培训考试模式 + public static String GET_YYTYPEANDEXAMMODEL_URL="CBS/Api/YYGL/GetYYType.ashx?typecode="; + //获取厂内人员组织结构 + public static String GETDEPTUSER_URL="CBS/Api/YYGL/GetDeptUser.ashx"; + //获取预约人的承包商信息以及该承包商下的人员 + public static String GET_CBSUSERLISTBYZJHM_URL="CBS/Api/YYGL/GetCBSUserListByZJHM.ashx?zjhm="; + //获取部门 + public static String GET_DEPT_LIST_URL="CBS/Api/YYGL/GetDeptList.ashx"; + //获取班组 + public static String GET_DEPT_BZ_LIST_URL="CBS/Api/YYGL/GetDeptBZList.ashx?deptcode="; + //获取可预约人数 + public static String GET_CAN_APPOINTMENT_COUNT_URL="CBS/Api/YYGL/GetKyyRs.ashx"; + //预约保存主数据 + public static String SAVE_CAN_APPOINTMENT_MAIN_URL="CBS/Api/YYGL/SaveCBSYYMain.ashx"; + //保存预约人员数据 + public static String SAVE_CAN_APPOINTMENT_USERS_URL="CBS/Api/YYGL/SaveCBSYYUsers.ashx"; + //获取有预约的日期(从当前时间起) + public static String GET_YYDATE_URL="CBS/Api/YYGL/GetYYDate.ashx"; + //获取每天预约详细 + public static String GET_YYDATEDETAILLIST_URL="CBS/Api/YYGL/GetYYDateList.ashx?yyrq="; + //获取生产岗位培训室使用时间 + public static String GET_YYDATESCGW_URL="CBS/Api/YYGL/GetYYDateSCGW.ashx?time="; + +} diff --git a/app/src/main/java/com/rehome/meetingbook/MainActivity.java b/app/src/main/java/com/rehome/meetingbook/MainActivity.java new file mode 100644 index 0000000..97267e8 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/MainActivity.java @@ -0,0 +1,269 @@ +package com.rehome.meetingbook; + +import android.app.DownloadManager; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.Toolbar; + +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.GridView; + + +import com.rehome.meetingbook.adapter.GridViewAdapter; +import com.rehome.meetingbook.base.BaseActivity2; +import com.rehome.meetingbook.bean.GridViewBean; +import com.rehome.meetingbook.databinding.ActivityMainBinding; +import com.rehome.meetingbook.ui.activity.LoginActivity; +import com.rehome.meetingbook.ui.activity.SimpleActivity; +import com.rehome.meetingbook.utils.ControllerActivity; + +import java.util.ArrayList; +import java.util.List; + + +public class MainActivity extends BaseActivity2 { + + GridView gv; + private List beanList = new ArrayList<>(); + private GridViewAdapter adapter; + + private List dialogDatas; + private List dialogDatas2; + DownloadManager DM, mDownloadManager; + private long downloadId; + private boolean isTask = false;//是否有任务 + private long exitTime = 0; +// private String[] str = {"考试预约", "预约记录", "安健环巡查", "综合巡查", "行为安全观察", "工单录入", "巡视抄表", "定期工作", "定期工作"}; +// private int[] imageId = {R.mipmap.appointment, +// R.mipmap.appointment_record, +// R.mipmap.icon10, +// R.mipmap.icon12, +// R.mipmap.icon14, +// R.mipmap.icon13, +// R.mipmap.icon6, R.mipmap.dingqi, R.mipmap.dingqi +// }; +// private int[] colors = {R.drawable.radius_a1, R.drawable.radius_a2, +// R.drawable.radius_a3, R.drawable.radius_a4, +// R.drawable.radius_d3, R.drawable.radius_c5, R.drawable.radius_e3, R.drawable.radius_a1, +// R.drawable.radius_a2}; + + private String[] str = { + "考试预约", "预约查询", "预约一览" + }; + private int[] imageId = { + R.mipmap.appointment, + R.mipmap.appointment_record, + R.mipmap.icon13 + }; + private int[] colors = { + R.drawable.radius_a1, + R.drawable.radius_a2, + R.drawable.radius_a3 + }; + private List item; + + private String idCardNo; + private String xm; + + + // android:background="@drawable/home_bg" + + + @Override + protected ActivityMainBinding getBinding() { + return ActivityMainBinding.inflate(LayoutInflater.from(this)); + } + + @Override + protected Toolbar getToolbar() { + return binding.toolbarView.toolbar; + } + + @Override + protected void initView() { + + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + + binding.toolbarView.title.setText("承包商考试预约"); + mToolbar.setBackgroundColor(Color.parseColor("#00000000")); + gv = findViewById(R.id.gv); + setExitZx(); + } + + @Override + public void initData() { + + Intent intent = getIntent(); + idCardNo = intent.getStringExtra("idCardNo"); + xm = intent.getStringExtra("xm"); + + dialogDatas = new ArrayList<>(); + dialogDatas2 = new ArrayList<>(); + + + item = new ArrayList<>(); + + beanList.addAll(getGridViewData(isTask)); + + gv.setSelector(new ColorDrawable(Color.TRANSPARENT)); + adapter = new GridViewAdapter(this, beanList, item, true); + gv.setAdapter(adapter); + + + gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + Intent intent; + switch (position) { + case 0: + +// intent = new Intent(); +// intent.setClass(MainActivity.this, ExamAppointmentActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// intent.putExtra("idCardNo", idCardNo); +// startActivity(intent); + + break; + case 1: + +// intent = new Intent(); +// intent.setClass(MainActivity.this, AppointmentListActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// intent.putExtra("idCardNo", idCardNo); +// startActivity(intent); + + break; + case 2: + + intent = new Intent(); + //intent.setClass(MainActivity.this, AppointmentDateActivity.class); + intent.setClass(MainActivity.this, SimpleActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra("idCardNo", idCardNo); + startActivity(intent); + + break; + default: + break; + } + } + }); + } + + // 按两次返回键退出程序 + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + if ((System.currentTimeMillis() - exitTime) > 2000) { + showToast("再按一次退出程序"); + exitTime = System.currentTimeMillis(); + } else { + ControllerActivity.getAppManager().finishAllActivity(); + finish(); + System.exit(0); + } + return true; + } + return super.onKeyDown(keyCode, event); + } + + private void setExitZx() { + mToolbar.setNavigationIcon(R.mipmap.back); + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle("提示"); + builder.setMessage("你确定要退出程序?"); + builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ControllerActivity.getAppManager().finishAllActivity(); + finish(); + System.exit(0); + dialog.dismiss(); + } + }); + builder.create().show(); + + } + }); + mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + + switch (item.getItemId()) { + case R.id.zx: + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle("提示"); + builder.setMessage("您确定要注销吗?"); + builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ControllerActivity.getAppManager().finishAllActivity(); + Intent intent = new Intent(MainActivity.this, LoginActivity.class); + startActivity(intent); + //finish(); + dialog.dismiss(); + } + }); + builder.create().show(); + break; + } + return true; + } + }); + } + + /** + * @param isTask 是否有行为安全观察任务 + * @return + */ + private List getGridViewData(boolean isTask) { + + List datas = new ArrayList<>(); + for (int i = 0; i < str.length; i++) { + GridViewBean bean = new GridViewBean(); + bean.setTitle(str[i]); + bean.setBackgroup(colors[i]); + bean.setImageid(imageId[i]); + bean.setShow(isTask); + datas.add(bean); + } + + return datas; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu, menu); + return super.onCreateOptionsMenu(menu); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManager.java b/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManager.java new file mode 100644 index 0000000..8451c7d --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManager.java @@ -0,0 +1,163 @@ +package com.rehome.meetingbook.ZKUSBManager; + + +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; + +import androidx.annotation.NonNull; + +import java.util.Random; + +/** + * usb permission and hotplug + */ +public class ZKUSBManager { + //usb's vendor id + private int vid = 0; + //usb's product id + private int pid = 0; + //application context + private Context mContext = null; + + ///////////////////////////////////////////// + //for usb permission + private static final String SOURCE_STRING = "0123456789-_abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ"; + private static final int DEFAULT_LENGTH = 16; + private String ACTION_USB_PERMISSION; + private boolean mbRegisterFilter = false; + private ZKUSBManagerListener zknirusbManagerListener = null; + + private BroadcastReceiver usbMgrReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (ACTION_USB_PERMISSION.equals(action)) + { + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device.getVendorId() == vid && device.getProductId() == pid) { + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { + zknirusbManagerListener.onCheckPermission(0); + } else { + zknirusbManagerListener.onCheckPermission(-2); + } + } + } + else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) + { + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device.getVendorId() == vid && device.getProductId() == pid) { + zknirusbManagerListener.onUSBArrived(device); + } + } + else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) + { + UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device.getVendorId() == vid && device.getProductId() == pid) { + zknirusbManagerListener.onUSBRemoved(device); + } + } + } + }; + + + private boolean isNullOrEmpty(String target) { + if (null == target || "".equals(target) || target.isEmpty()) { + return true; + } + return false; + } + + private String createRandomString(String source, int length) { + if (this.isNullOrEmpty(source)) { + return ""; + } + + StringBuffer result = new StringBuffer(); + Random random = new Random(); + + for(int index = 0; index < length; index++) { + result.append(source.charAt(random.nextInt(source.length()))); + } + return result.toString(); + } + + public boolean registerUSBPermissionReceiver() + { + if (null == mContext || mbRegisterFilter) + { + return false; + } + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_USB_PERMISSION); + filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); + filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); + mContext.registerReceiver(usbMgrReceiver, filter); + mbRegisterFilter = true; + return true; + } + + public void unRegisterUSBPermissionReceiver() + { + if (null == mContext || !mbRegisterFilter) + { + return; + } + mContext.unregisterReceiver(usbMgrReceiver); + mbRegisterFilter = false; + } + + + //End USB Permission + ///////////////////////////////////////////// + + public ZKUSBManager(@NonNull Context context, @NonNull ZKUSBManagerListener listener) + { + super(); + if (null == context || null == listener) + { + throw new NullPointerException("context or listener is null"); + } + zknirusbManagerListener = listener; + ACTION_USB_PERMISSION = createRandomString(SOURCE_STRING, DEFAULT_LENGTH); + mContext = context; + } + + //0 means success + //-1 means device no found + //-2 means device no permission + public void initUSBPermission(int vid, int pid){ + UsbManager usbManager = (UsbManager)mContext.getSystemService(Context.USB_SERVICE); + UsbDevice usbDevice = null; + for (UsbDevice device : usbManager.getDeviceList().values()) { + int device_vid = device.getVendorId(); + int device_pid = device.getProductId(); + if (device_vid == vid && device_pid == pid) + { + usbDevice = device; + break; + } + } + if (null == usbDevice) + { + zknirusbManagerListener.onCheckPermission(-1); + return; + } + this.vid = vid; + this.pid = pid; + if (!usbManager.hasPermission(usbDevice)) + { + Intent intent = new Intent(this.ACTION_USB_PERMISSION); + PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); + usbManager.requestPermission(usbDevice, pendingIntent); + } + else { + zknirusbManagerListener.onCheckPermission(0); + } + } + +} diff --git a/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManagerListener.java b/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManagerListener.java new file mode 100644 index 0000000..5b95d7e --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/ZKUSBManager/ZKUSBManagerListener.java @@ -0,0 +1,16 @@ +package com.rehome.meetingbook.ZKUSBManager; + + +import android.hardware.usb.UsbDevice; + +public interface ZKUSBManagerListener +{ + //0 means success + //-1 means device no found + //-2 means device no permission + void onCheckPermission(int result); + + void onUSBArrived(UsbDevice device); + + void onUSBRemoved(UsbDevice device); +} diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentDateAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentDateAdapter.java new file mode 100644 index 0000000..2fef9e9 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentDateAdapter.java @@ -0,0 +1,52 @@ +package com.rehome.meetingbook.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.rehome.meetingbook.bean.AppointmentDateDetailListBean; +import com.rehome.meetingbook.databinding.AdapterAppointmentDateBinding; +import com.rehome.meetingbook.databinding.AdapterContactBinding; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-21 09:30 + * 描述: + */ +public class AppointmentDateAdapter extends MyAdapter{ + + private List datas; + + public AppointmentDateAdapter(Context context, List datas) { + super(context); + this.datas=datas; + } + + @Override + protected void handleData(int position, AdapterAppointmentDateBinding binding) { + AppointmentDateDetailListBean.RowsBean item = datas.get(position); + binding.tvDesc.setText(item.getPskssj_s()+" 至 "+item.getPskssj_e()+"共:"+item.getRs()+"人,还可预约"+ item.getKyyrs() + "人"); + } + + @Override + protected AdapterAppointmentDateBinding getBinding(LayoutInflater inflater, ViewGroup parent) { + return AdapterAppointmentDateBinding.inflate(inflater, parent, false); + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public Object getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentMemberAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentMemberAdapter.java new file mode 100644 index 0000000..d55b520 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/AppointmentMemberAdapter.java @@ -0,0 +1,90 @@ +package com.rehome.meetingbook.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.bean.AppointmentMemberBean; +import com.rehome.meetingbook.databinding.AdapterAppointmentMemberBinding; +import com.rehome.meetingbook.databinding.AdapterAppointmentResultBinding; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-10 15:06 + * 描述:预约成员适配器 + */ +public class AppointmentMemberAdapter extends MyAdapter{ + + private List datas; + private final Context context; + private DeleteItemListener deleteItemListener; + + public AppointmentMemberAdapter(Context context, List datas,DeleteItemListener deleteItemListener) { + super(context); + this.datas = datas; + this.context=context; + this.deleteItemListener=deleteItemListener; + } + + @Override + protected void handleData(int position, AdapterAppointmentMemberBinding binding) { + + AppointmentMemberBean.RowsBean bean = (AppointmentMemberBean.RowsBean) getItem(position); + + if ((position + 1) % 2 == 0) { + binding.ll.setBackgroundColor(context.getResources().getColor(R.color.itemColor)); + } else { + binding.ll.setBackgroundColor(context.getResources().getColor(R.color.white)); + } + + binding.tvXm.setText(bean.getXm()); + + if (bean.getIszzpfzr()!=null&&bean.getIszzpfzr().equals("1")){ + binding.tvXm.setText(bean.getXm()+"(工作负责人)"); + } + + binding.tvSfzh.setText(bean.getSfzh()); + binding.tvPszb.setText(bean.getPszbName()); + binding.tvYyrq.setText(bean.getYyrq()); + + binding.tvPsbm.setText(bean.getPsbmName()); + binding.tvPsbz.setText(bean.getPsbzName()); + binding.imageViewDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(deleteItemListener!=null){ + deleteItemListener.deleteItem(bean.getSfzh()); + } + } + }); + + } + + @Override + protected AdapterAppointmentMemberBinding getBinding(LayoutInflater inflater, ViewGroup parent) { + return AdapterAppointmentMemberBinding.inflate(inflater, parent, false); + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public Object getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + public interface DeleteItemListener { + void deleteItem(String sfzh); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/ContactAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/ContactAdapter.java new file mode 100644 index 0000000..96a0c54 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/ContactAdapter.java @@ -0,0 +1,82 @@ +package com.rehome.meetingbook.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.bumptech.glide.Glide; +import com.rehome.meetingbook.Contans; +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.bean.ContactListBean; +import com.rehome.meetingbook.databinding.AdapterAppointmentResultBinding; +import com.rehome.meetingbook.databinding.AdapterContactBinding; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-08 14:29 + * 描述: + */ +public class ContactAdapter extends MyAdapter{ + private final Context context; + private final List datas; + + public ContactAdapter(Context context, List datas) { + super(context); + this.datas = datas; + this.context=context; + } + + @Override + protected void handleData(int position, AdapterContactBinding binding) { + ContactListBean.RowsBean.OrderlistBean item = datas.get(position); + + if (!TextUtils.isEmpty(item.getName())) { + binding.ll.setVisibility(View.VISIBLE); + binding.tvDeptName.setVisibility(View.GONE); + binding.tvName.setText(item.getName()); + binding.tvPhone1.setText(item.getTelephone()); + binding.tvPhone2.setText(item.getAddress_tel()); + + if (!item.getAccount_head().equals("")) { + Glide.with(context).load(Contans.BASE_URL + item.getAccount_head()).into(binding.headView); + } else { + binding.headView.setImageResource(R.drawable.head_photo); + } + + } else { + + if (position == 0) { + binding.tvDeptName.setVisibility(View.GONE); + binding.ll.setVisibility(View.GONE); + } else { + binding.tvDeptName.setText(item.getGroupName()); + binding.ll.setVisibility(View.GONE); + binding.tvDeptName.setVisibility(View.VISIBLE); + } + } + } + + @Override + protected AdapterContactBinding getBinding(LayoutInflater inflater, ViewGroup parent) { + return AdapterContactBinding.inflate(inflater, parent, false); + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public Object getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/GridViewAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/GridViewAdapter.java new file mode 100644 index 0000000..f2e7453 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/GridViewAdapter.java @@ -0,0 +1,114 @@ +package com.rehome.meetingbook.adapter; + + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + + +import com.rehome.meetingbook.bean.GridViewBean; +import com.rehome.meetingbook.R; + +import java.util.List; +/** + * Create By HuangWenFei + * 创建日期:2022-11-25 19:51 + * 描述: + */ +public class GridViewAdapter extends BaseAdapter { + + private Context context; + + private List datas; + + + private int item = 0; + + private List items;//通过传入一些item,让传入的item不可以点击 + + + private boolean flag; + + + public GridViewAdapter(Context context, List datas, List items, boolean flag) { + this.context = context; + this.items = items; + this.flag = flag; + this.datas = datas; + } + + @Override + public int getCount() { + + return datas.size(); + } + + @Override + public GridViewBean getItem(int i) { + return datas.get(i); + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public View getView(int position, View view, ViewGroup viewGroup) { + + ViewHolder holder; + + if (view == null) { + holder = new ViewHolder(); + view = LayoutInflater.from(context).inflate(R.layout.gridview_item, viewGroup, false); + holder.iv = (ImageView) view.findViewById(R.id.iv); + holder.tv = (TextView) view.findViewById(R.id.tv); + holder.ll = (LinearLayout) view.findViewById(R.id.ll); + holder.red_dot = (ImageView) view.findViewById(R.id.iv_reddot); + view.setTag(holder); + //AutoUtils.autoSize(view); + } else { + holder = (ViewHolder) view.getTag(); + } + + GridViewBean bean = getItem(position); + +// holder.ll.setBackgroundColor(context.getResources().getColor(bean.getBackgroup())); + + holder.ll.setBackgroundResource(bean.getBackgroup()); + holder.red_dot.setVisibility(bean.isShow() ? View.VISIBLE : View.GONE); + + if (bean.getTitle() != " ") { + holder.iv.setImageResource(bean.getImageid()); + } + holder.tv.setText(bean.getTitle()); + return view; + } + + static class ViewHolder { + TextView tv; + ImageView iv; + LinearLayout ll; + ImageView red_dot; + } + + //重写isEnabled,传入哪个position, + @Override + public boolean isEnabled(int position) { + + if (!flag) { + for (int i = 0; i < items.size(); i++) { + if (position == items.get(i)) { + return true; + } + } + return false; + } + return true; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/MyAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/MyAdapter.java new file mode 100644 index 0000000..5e5abba --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/MyAdapter.java @@ -0,0 +1,49 @@ +package com.rehome.meetingbook.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import androidx.viewbinding.ViewBinding; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-06 14:23 + * 描述: + */ +public abstract class MyAdapter extends BaseAdapter { + + private final LayoutInflater inflater; + public MyAdapter(Context context) { + inflater = LayoutInflater.from(context); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + if (null == convertView) { + T binding = getBinding(inflater, parent); + holder = new ViewHolder(binding); + convertView = binding.getRoot(); + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + handleData(position, holder.binding); + return convertView; + } + + protected abstract void handleData(int position, T binding); + + protected abstract T getBinding(LayoutInflater inflater, ViewGroup parent); + + class ViewHolder { + + private final T binding; + public ViewHolder(T binding) { + this.binding = binding; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/YunQingExalAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/YunQingExalAdapter.java new file mode 100644 index 0000000..b007f61 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/YunQingExalAdapter.java @@ -0,0 +1,51 @@ +package com.rehome.meetingbook.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.rehome.meetingbook.bean.YunQingExalBean; +import com.rehome.meetingbook.databinding.AdapterAppointmentDateBinding; +import com.rehome.meetingbook.databinding.AdapterYunQingExamBinding; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-21 11:11 + * 描述: + */ +public class YunQingExalAdapter extends MyAdapter{ + private List datas; + + public YunQingExalAdapter(Context context, List datas) { + super(context); + this.datas=datas; + } + + @Override + protected void handleData(int position, AdapterYunQingExamBinding binding) { + YunQingExalBean.RowsBean item = datas.get(position); + binding.tvDesc.setText(item.getTimes()+" 至 "+item.getTimee()+","+item.getDepartment_name()); + } + + @Override + protected AdapterYunQingExamBinding getBinding(LayoutInflater inflater, ViewGroup parent) { + return AdapterYunQingExamBinding.inflate(inflater, parent, false); + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public Object getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/adapter/base/AppointmentResultAdapter.java b/app/src/main/java/com/rehome/meetingbook/adapter/base/AppointmentResultAdapter.java new file mode 100644 index 0000000..72fabeb --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/adapter/base/AppointmentResultAdapter.java @@ -0,0 +1,80 @@ +package com.rehome.meetingbook.adapter.base; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.adapter.MyAdapter; +import com.rehome.meetingbook.bean.AppointmentResultBean; +import com.rehome.meetingbook.databinding.AdapterAppointmentResultBinding; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-06 14:24 + * 描述: + */ +public class AppointmentResultAdapter extends MyAdapter { + + private List datas; + private final Context context; + + public AppointmentResultAdapter(Context context, List datas) { + super(context); + this.datas = datas; + this.context=context; + //Log.i("app", GsonUtils.GsonString(datas)); + } + + @Override + protected void handleData(int position, AdapterAppointmentResultBinding binding) { + AppointmentResultBean.RowsBean bean = (AppointmentResultBean.RowsBean) getItem(position); + + if ((position + 1) % 2 == 0) { + binding.ll.setBackgroundColor(context.getResources().getColor(R.color.itemColor)); + } else { + binding.ll.setBackgroundColor(context.getResources().getColor(R.color.white)); + } + + binding.tvYyrq.setText(bean.getYyrq()); + binding.tvKsms.setText(bean.getPsmodelname()); + binding.tvXm.setText(bean.getYyrxm()); + binding.tvCbsfzr.setText(bean.getXxfzrname()); + + binding.tvYyType.setText(bean.getYylx()); + binding.tvCbsname.setText(bean.getCbsname()); + binding.tvPxrName.setText(bean.getXm()); + binding.tvYydj.setText(bean.getPszb()); + + binding.tvPsbm.setText(bean.getPsbm()); + binding.tvPsbz.setText(bean.getPsbz()); + binding.tvIszzpfzr.setText(bean.getIszzpfzr()); + binding.tvIsys.setText(bean.getIsys()); + + binding.tvIssendrl.setText(bean.getIssendrl()); + binding.tvShstate.setText(bean.getShstate()); + binding.tvShsj.setText(bean.getShsj()); + } + + @Override + protected AdapterAppointmentResultBinding getBinding(LayoutInflater inflater, ViewGroup parent) { + return AdapterAppointmentResultBinding.inflate(inflater, parent, false); + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public Object getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseActivity.java b/app/src/main/java/com/rehome/meetingbook/base/BaseActivity.java new file mode 100644 index 0000000..d6606b0 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseActivity.java @@ -0,0 +1,112 @@ +package com.rehome.meetingbook.base; + + +import android.app.PendingIntent; +import android.content.Context; +import android.content.IntentFilter; +import android.os.Bundle; +import androidx.annotation.LayoutRes; +import androidx.appcompat.widget.Toolbar; +import android.view.View; +import android.view.WindowManager; +import android.widget.TextView; +import android.widget.Toast; +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.utils.ControllerActivity; +import com.zhy.autolayout.AutoLayoutActivity; + + +/** + * Create By HuangWenFei + * 创建日期:2022-12-07 14:29 + * 描述: + */ +public abstract class BaseActivity extends AutoLayoutActivity { + + public static final int CX_FLAG = 0;//查询的状态码 + public static final int SC_FLAG = 1;//上传的状态码 + + public Toolbar mToolbar; + public TextView title; + public Context context; + + private String readResult = ""; + private PendingIntent pendingIntent; + private IntentFilter[] mFilters; + private String[][] mTechLists; + private boolean isFirst = true; + private IntentFilter ndef; + + + public abstract int getContentViewID(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + setContentView(getContentViewID()); + context = this; + ControllerActivity.getAppManager().addActivity(this); + mToolbar = (Toolbar) findViewById(R.id.toolbar); + title = (TextView) findViewById(R.id.title); + mToolbar.setTitle(""); + setSupportActionBar(mToolbar); + + initView(); + initData(); + } + + @Override + public void setContentView(@LayoutRes int layoutResID) { + super.setContentView(layoutResID); + } + + /** + * 初始化View + */ + protected abstract void initView(); + + /** + * 初始化数据 + */ + protected abstract void initData(); + + @Override + protected void onDestroy() { + super.onDestroy(); + ControllerActivity.getAppManager().finishActivity(this); + context = null; + } + + /** + * 显示toast + * + * @param text + */ + public void showToast(String text) { + if (text != null && !text.trim().equals("")) { + Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); + } + } + + public void showToast(int id) { + Toast.makeText(this, id, Toast.LENGTH_SHORT).show(); + } + + + public void setTitle(String title) { + this.title.setText(title); + } + + public void setBack() { + mToolbar.setNavigationIcon(R.mipmap.back); + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseActivity2.java b/app/src/main/java/com/rehome/meetingbook/base/BaseActivity2.java new file mode 100644 index 0000000..7221703 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseActivity2.java @@ -0,0 +1,67 @@ +package com.rehome.meetingbook.base; + +import android.content.Context; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.viewbinding.ViewBinding; + +import com.rehome.meetingbook.utils.ControllerActivity; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-06 17:35 + * 描述: + */ +public abstract class BaseActivity2 extends AppCompatActivity { + + protected T binding; + protected Toolbar mToolbar; + public Context context; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + binding = getBinding(); + mToolbar = getToolbar(); + setContentView(binding.getRoot()); + context = this; + ControllerActivity.getAppManager().addActivity(this); + mToolbar.setTitle(""); + setSupportActionBar(mToolbar); + + initView(); + initData(); + + } + @Override + protected void onDestroy() { + super.onDestroy(); + ControllerActivity.getAppManager().finishActivity(this); + context = null; + } + /** + * 显示toast + * @param text + */ + public void showToast(String text) { + if (text != null && !text.trim().equals("")) { + Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); + } + } + + public void showToast(int id) { + Toast.makeText(this, id, Toast.LENGTH_SHORT).show(); + } + + protected abstract T getBinding(); + protected abstract Toolbar getToolbar(); + protected abstract void initView(); + protected abstract void initData(); + +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseCallBack.java b/app/src/main/java/com/rehome/meetingbook/base/BaseCallBack.java new file mode 100644 index 0000000..4672152 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseCallBack.java @@ -0,0 +1,46 @@ +package com.rehome.meetingbook.base; + +import android.content.Context; +import android.widget.Toast; + +import com.rehome.meetingbook.weiget.LoadDialog; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * Created by Rehome-rjb1 on 2017/5/17. + * 请求数据的封装,封装了一个dialog + */ + +public abstract class BaseCallBack implements Callback { + + private final Context context; + + private final LoadDialog dialog; + + public BaseCallBack(Context context) { + this.context = context; + dialog = new LoadDialog(context, false, "正在加载中..."); + dialog.show(); + } + + @Override + public void onResponse(Call call, Response response) { + dialog.dismiss(); + onSuccess(call, response); + + } + + @Override + public void onFailure(Call call, Throwable t) { + dialog.dismiss(); + Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show(); + onError(call, t); + } + + public abstract void onSuccess(Call call, Response response); + + public abstract void onError(Call call, Throwable t); +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseCallBackNoProgress.java b/app/src/main/java/com/rehome/meetingbook/base/BaseCallBackNoProgress.java new file mode 100644 index 0000000..765e820 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseCallBackNoProgress.java @@ -0,0 +1,40 @@ +package com.rehome.meetingbook.base; + + +import android.content.Context; +import android.widget.Toast; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +/** + * Created by Rehome-rjb1 on 2017/5/17. + * 请求数据的封装,封装了一个dialog + */ + +public abstract class BaseCallBackNoProgress implements Callback { + + private final Context context; + + + public BaseCallBackNoProgress(Context context) { + this.context = context; + } + + @Override + public void onResponse(Call call, Response response) { + onSuccess(call, response); + + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show(); + onError(call, t); + } + + public abstract void onSuccess(Call call, Response response); + + public abstract void onError(Call call, Throwable t); +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseFragment.java b/app/src/main/java/com/rehome/meetingbook/base/BaseFragment.java new file mode 100644 index 0000000..f2b04bc --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseFragment.java @@ -0,0 +1,54 @@ +package com.rehome.meetingbook.base; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +/** + * Created by Rehome-rjb1 on 2017/5/8. + * fragment的基类,所有的fragment都继承它 + */ + +public abstract class BaseFragment extends Fragment { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + + View view = inflater.inflate(getLayoutId(), container, false); + initData(); + return view; + } + + public abstract int getLayoutId(); + + public abstract void initData(); + + @Override + public void onDestroyView() { + super.onDestroyView(); + } + + public void showToast(String msg) { + Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); + } + + public void showToast(int strId) { + Toast.makeText(getContext(), strId, Toast.LENGTH_SHORT).show(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + @Override + public void onDetach() { + super.onDetach(); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseFragment2.java b/app/src/main/java/com/rehome/meetingbook/base/BaseFragment2.java new file mode 100644 index 0000000..4ef945c --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseFragment2.java @@ -0,0 +1,76 @@ +package com.rehome.meetingbook.base; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + + +/** + * Created by ruihong on 2017/10/28. + */ + +public abstract class BaseFragment2 extends Fragment { + + public static final int CX_FLAG = 0;//查询的状态码 + public static final int SC_FLAG = 1;//上传的状态码 + + public abstract int getContentViewId(); + + public Activity mActivity; + public View view; + + public Context context; + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + this.context = context; + mActivity = getActivity(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + view = inflater.inflate(getContentViewId(), container, false); + //Logger.v("fragment:" + getClass().getSimpleName()); + initView(); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + initData(); + } + + /** + * 初始化视图 + */ + protected abstract void initView(); + + /** + * 初始化数据 + */ + public void initData() { + + } + + public void showToast(String text) { + if (text != null && !text.trim().equals("")) { + Toast.makeText(getActivity(), text, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/base/BaseLazyFragment.java b/app/src/main/java/com/rehome/meetingbook/base/BaseLazyFragment.java new file mode 100644 index 0000000..c52513f --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/base/BaseLazyFragment.java @@ -0,0 +1,198 @@ +package com.rehome.meetingbook.base; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + + +/** + * Created by ruihong on 2018/4/20. + */ + +public abstract class BaseLazyFragment extends Fragment { + + private boolean isPrepared; + + protected View mRootView; + + + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + mRootView = inflater.inflate(getContentViewId(), container, false); + //绑定到butterKnife + return mRootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + //如果要使用eventBus请将此方法返回true + + initPrepare(); + } + + @Override + public void onViewStateRestored(@Nullable Bundle savedInstanceState) { + super.onViewStateRestored(savedInstanceState); + + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + this.mRootView = null; + } + + + /** + * 初始化视图 + * + * @return the int + */ + protected abstract int getContentViewId(); + + /** + * 初始化控件 + */ + protected abstract void initView(); + + + /** + * 初始话数据 + */ + protected abstract void initData(); + + /** + * 初始化监听 + */ + protected abstract void initListener(); + + + /** + * 此方法是让外部调用使fragment做一些操作的,比如说外部的activity想让fragment对象执行一些方法, + * 建议在有多个需要让外界调用的方法时,统一传bundle,里面存一个what字段,来区分不同的方法,在setData + * 方法中就可以switch做不同的操作,这样就可以用统一的入口方法做不同的事,和message同理 + *

+ * 使用此方法时请注意调用时fragment的生命周期,如果调用此setData方法时onActivityCreated + * 还没执行,setData里调用presenter的方法时,是会报空的,因为dagger注入是在onActivityCreated + * 方法中执行的,如果要做一些初始化操作,可以不必让外部调setData,在内部onActivityCreated中 + * 初始化就可以了 + * + * @param data + */ + public void setData(Object data) { + + } + + /** + * 使用此方法时请注意调用时fragment的生命周期,如果调用此setData方法时onActivityCreated + * 还没执行,setData里调用presenter的方法时,是会报空的,因为dagger注入是在onActivityCreated + * 方法中执行的,如果要做一些初始化操作,可以不必让外部调setData,在内部onActivityCreated中 + * 初始化就可以了 + */ + public void setData() { + + } + + /** + * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复 + */ + private boolean isFirstResume = true; + + @Override + public void onResume() { + super.onResume(); + if (isFirstResume) { + isFirstResume = false; + return; + } + if (getUserVisibleHint()) { + onUserVisible(); + } + } + + @Override + public void onPause() { + super.onPause(); + if (getUserVisibleHint()) { + onUserInvisible(); + } + } + + private boolean isFirstVisible = true; + private boolean isFirstInvisible = true; + + @Override + public void setUserVisibleHint(boolean isVisibleToUser) { + super.setUserVisibleHint(isVisibleToUser); + if (isVisibleToUser) { + if (isFirstVisible) { + isFirstVisible = false; + initPrepare(); + } else { + onUserVisible(); + } + } else { + if (isFirstInvisible) { + isFirstInvisible = false; + onFirstUserInvisible(); + } else { + onUserInvisible(); + } + } + } + + public synchronized void initPrepare() { + if (isPrepared) { + onFirstUserVisible(); + } else { + isPrepared = true; + } + } + + /** + * 第一次fragment可见(进行初始化工作) + */ + public void onFirstUserVisible() { + initView(); + initData(); + initListener(); + } + + /** + * fragment可见(切换回来或者onResume) + */ + public void onUserVisible() { + + } + + /** + * 第一次fragment不可见(不建议在此处理事件) + */ + public void onFirstUserInvisible() { + + } + + /** + * fragment不可见(切换掉或者onPause) + */ + public void onUserInvisible() { + + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateDetailListBean.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateDetailListBean.java new file mode 100644 index 0000000..00f2a40 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateDetailListBean.java @@ -0,0 +1,94 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-20 17:16 + * 描述: + */ + +public class AppointmentDateDetailListBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + //培训考试模式(20001:日常培训考试,20002:集中培训考试) + private String psmodel; + //预约日期(格式:HH:mm) + private String yyrq; + //培训考试起始时间(格式:HH:mm) + private String pskssj_s; + //培训考试结束时间(格式:HH:mm) + private String pskssj_e; + //预约总人数 + private String rs; + //还可预约人数 + private String kyyrs; + + public String getPsmodel() { + return psmodel; + } + + public void setPsmodel(String psmodel) { + this.psmodel = psmodel; + } + + public String getYyrq() { + return yyrq; + } + + public void setYyrq(String yyrq) { + this.yyrq = yyrq; + } + + public String getPskssj_s() { + return pskssj_s; + } + + public void setPskssj_s(String pskssj_s) { + this.pskssj_s = pskssj_s; + } + + public String getPskssj_e() { + return pskssj_e; + } + + public void setPskssj_e(String pskssj_e) { + this.pskssj_e = pskssj_e; + } + + public String getRs() { + return rs; + } + + public void setRs(String rs) { + this.rs = rs; + } + + public String getKyyrs() { + return kyyrs; + } + + public void setKyyrs(String kyyrs) { + this.kyyrs = kyyrs; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateListBean.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateListBean.java new file mode 100644 index 0000000..dda9132 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentDateListBean.java @@ -0,0 +1,64 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-20 16:48 + * 描述: + */ + +public class AppointmentDateListBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + //预约日期(格式:yyyy-MM-dd) + private String yyrq; + //预约日期(格式:yyyy-M-d) + private String yyrq2; + //预约总人数 + private String rs; + + public String getYyrq() { + return yyrq; + } + + public void setYyrq(String yyrq) { + this.yyrq = yyrq; + } + + public String getYyrq2() { + return yyrq2; + } + + public void setYyrq2(String yyrq2) { + this.yyrq2 = yyrq2; + } + + public String getRs() { + return rs; + } + + public void setRs(String rs) { + this.rs = rs; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentLevelBean.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentLevelBean.java new file mode 100644 index 0000000..bdbfa95 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentLevelBean.java @@ -0,0 +1,51 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * 预约等级 + */ +public class AppointmentLevelBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + //id + private String id; + //预约等级 + private String text; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberBean.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberBean.java new file mode 100644 index 0000000..5310abc --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberBean.java @@ -0,0 +1,154 @@ +package com.rehome.meetingbook.bean; + +import java.util.ArrayList; +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-10 14:27 + * 描述: + */ +public class AppointmentMemberBean { + private String mainid; + private List Rows = new ArrayList<>(); + + public String getMainid() { + return mainid; + } + + public void setMainid(String mainid) { + this.mainid = mainid; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + //预约时间(格式:yyyy-MM-dd HH:mm) + private String yyrq=""; + //预约等级ID + private String pszb=""; + //预约等级名称 + private String pszbName=""; + //预约部门ID + private String psbm=""; + //预约部门名称 + private String psbmName=""; + //预约班组ID + private String psbz=""; + //预约班组名称 + private String psbzName=""; + //姓名 + private String xm=""; + //身份证号 + private String sfzh=""; + //是否为工作票负责人培训(厂级:0否,1是,部门或班组级:空值) + private String iszzpfzr=""; + //是否特种作业人员 + private String istzzy=""; + //备注(三种人授权类型或特种作业工种) + private String bz=""; + + public String getYyrq() { + return yyrq; + } + + public void setYyrq(String yyrq) { + this.yyrq = yyrq; + } + + public String getPszb() { + return pszb; + } + + public void setPszb(String pszb) { + this.pszb = pszb; + } + + public String getPsbm() { + return psbm; + } + + public void setPsbm(String psbm) { + this.psbm = psbm; + } + + public String getPsbz() { + return psbz; + } + + public void setPsbz(String psbz) { + this.psbz = psbz; + } + + public String getXm() { + return xm; + } + + public void setXm(String xm) { + this.xm = xm; + } + + public String getSfzh() { + return sfzh; + } + + public void setSfzh(String sfzh) { + this.sfzh = sfzh; + } + + public String getIszzpfzr() { + return iszzpfzr; + } + + public void setIszzpfzr(String iszzpfzr) { + this.iszzpfzr = iszzpfzr; + } + + public String getIstzzy() { + return istzzy; + } + + public void setIstzzy(String istzzy) { + this.istzzy = istzzy; + } + + public String getBz() { + return bz; + } + + public void setBz(String bz) { + this.bz = bz; + } + + public String getPszbName() { + return pszbName; + } + + public void setPszbName(String pszbName) { + this.pszbName = pszbName; + } + + public String getPsbmName() { + return psbmName; + } + + public void setPsbmName(String psbmName) { + this.psbmName = psbmName; + } + + public String getPsbzName() { + return psbzName; + } + + public void setPsbzName(String psbzName) { + this.psbzName = psbzName; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberCount.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberCount.java new file mode 100644 index 0000000..952380d --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentMemberCount.java @@ -0,0 +1,52 @@ +package com.rehome.meetingbook.bean; + +/** + * 可预约人数 + */ +public class AppointmentMemberCount { + private boolean isyy; + private int rs; + private String msg; + private String times; + private String timee; + + public boolean isIsyy() { + return isyy; + } + + public void setIsyy(boolean isyy) { + this.isyy = isyy; + } + + public int getRs() { + return rs; + } + + public void setRs(int rs) { + this.rs = rs; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getTimes() { + return times; + } + + public void setTimes(String times) { + this.times = times; + } + + public String getTimee() { + return timee; + } + + public void setTimee(String timee) { + this.timee = timee; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/AppointmentResultBean.java b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentResultBean.java new file mode 100644 index 0000000..96ef1a6 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/AppointmentResultBean.java @@ -0,0 +1,240 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-01 14:57 + * 描述: + */ +public class AppointmentResultBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + private String yylx; + private String cbsname; + private String shstate; + private String xxfzrname; + private String psmodelname; + private String yyrq; + private String pszb; + private String psbm; + private String psbz; + private String xm; + private String sfzh; + private String iszzpfzr; + private String istzzy; + private String bz; + private String sszt; + private String ps_ssjd; + private String ks_istg; + private String ks_ksfs; + private String ks_ykscs; + private String issendrl; + private String isys; + private String shsj; + private String yyrxm; + + public String getYylx() { + return yylx; + } + + public void setYylx(String yylx) { + this.yylx = yylx; + } + + public String getCbsname() { + return cbsname; + } + + public void setCbsname(String cbsname) { + this.cbsname = cbsname; + } + + public String getShstate() { + return shstate; + } + + public void setShstate(String shstate) { + this.shstate = shstate; + } + + public String getXxfzrname() { + return xxfzrname; + } + + public void setXxfzrname(String xxfzrname) { + this.xxfzrname = xxfzrname; + } + + public String getPsmodelname() { + return psmodelname; + } + + public void setPsmodelname(String psmodelname) { + this.psmodelname = psmodelname; + } + + public String getYyrq() { + return yyrq; + } + + public void setYyrq(String yyrq) { + this.yyrq = yyrq; + } + + public String getPszb() { + return pszb; + } + + public void setPszb(String pszb) { + this.pszb = pszb; + } + + public String getPsbm() { + return psbm; + } + + public void setPsbm(String psbm) { + this.psbm = psbm; + } + + public String getPsbz() { + return psbz; + } + + public void setPsbz(String psbz) { + this.psbz = psbz; + } + + public String getXm() { + return xm; + } + + public void setXm(String xm) { + this.xm = xm; + } + + public String getSfzh() { + return sfzh; + } + + public void setSfzh(String sfzh) { + this.sfzh = sfzh; + } + + public String getIszzpfzr() { + return iszzpfzr; + } + + public void setIszzpfzr(String iszzpfzr) { + this.iszzpfzr = iszzpfzr; + } + + public String getIstzzy() { + return istzzy; + } + + public void setIstzzy(String istzzy) { + this.istzzy = istzzy; + } + + public String getBz() { + return bz; + } + + public void setBz(String bz) { + this.bz = bz; + } + + public String getSszt() { + return sszt; + } + + public void setSszt(String sszt) { + this.sszt = sszt; + } + + public String getPs_ssjd() { + return ps_ssjd; + } + + public void setPs_ssjd(String ps_ssjd) { + this.ps_ssjd = ps_ssjd; + } + + public String getKs_istg() { + return ks_istg; + } + + public void setKs_istg(String ks_istg) { + this.ks_istg = ks_istg; + } + + public String getKs_ksfs() { + return ks_ksfs; + } + + public void setKs_ksfs(String ks_ksfs) { + this.ks_ksfs = ks_ksfs; + } + + public String getKs_ykscs() { + return ks_ykscs; + } + + public void setKs_ykscs(String ks_ykscs) { + this.ks_ykscs = ks_ykscs; + } + + public String getIssendrl() { + return issendrl; + } + + public void setIssendrl(String issendrl) { + this.issendrl = issendrl; + } + + public String getIsys() { + return isys; + } + + public void setIsys(String isys) { + this.isys = isys; + } + + public String getShsj() { + return shsj; + } + + public void setShsj(String shsj) { + this.shsj = shsj; + } + + public String getYyrxm() { + return yyrxm; + } + + public void setYyrxm(String yyrxm) { + this.yyrxm = yyrxm; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/CbsBaseBean.java b/app/src/main/java/com/rehome/meetingbook/bean/CbsBaseBean.java new file mode 100644 index 0000000..6017bdc --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/CbsBaseBean.java @@ -0,0 +1,76 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-09 11:33 + * 描述: + */ + +public class CbsBaseBean { + //姓名 + private String xm; + //身份证号码 + private String zjhm; + //承包商名称 + private String cbsname; + //承包商人员集合 + private List listcbsusers; + + public String getXm() { + return xm; + } + + public void setXm(String xm) { + this.xm = xm; + } + + public String getZjhm() { + return zjhm; + } + + public void setZjhm(String zjhm) { + this.zjhm = zjhm; + } + + public String getCbsname() { + return cbsname; + } + + public void setCbsname(String cbsname) { + this.cbsname = cbsname; + } + + public List getListcbsusers() { + return listcbsusers; + } + + public void setListcbsusers(List listcbsusers) { + this.listcbsusers = listcbsusers; + } + + public static class RowsBean { + + //姓名 + private String xm; + //身份证号码 + private String zjhm; + + public String getXm() { + return xm; + } + + public void setXm(String xm) { + this.xm = xm; + } + + public String getZjhm() { + return zjhm; + } + + public void setZjhm(String zjhm) { + this.zjhm = zjhm; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/bean/CbsCanAppointmentBean.java b/app/src/main/java/com/rehome/meetingbook/bean/CbsCanAppointmentBean.java new file mode 100644 index 0000000..c8ad84c --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/CbsCanAppointmentBean.java @@ -0,0 +1,59 @@ +package com.rehome.meetingbook.bean; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-12 11:18 + * 描述: + */ +public class CbsCanAppointmentBean { + //是否可以预约(true:可以预约,false:不可以预约) + private Boolean isyy; + //可以预约的人数 + private String rs; + //信息提示 + private String msg; + //占用时间起始 + private String times; + //占用时间结束 + private String timee; + + public Boolean isIsyy() { + return isyy; + } + + public void setIsyy(Boolean isyy) { + this.isyy = isyy; + } + + public String getRs() { + return rs; + } + + public void setRs(String rs) { + this.rs = rs; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getTimes() { + return times; + } + + public void setTimes(String times) { + this.times = times; + } + + public String getTimee() { + return timee; + } + + public void setTimee(String timee) { + this.timee = timee; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/CbsYYUsersResultBean.java b/app/src/main/java/com/rehome/meetingbook/bean/CbsYYUsersResultBean.java new file mode 100644 index 0000000..ce8947e --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/CbsYYUsersResultBean.java @@ -0,0 +1,29 @@ +package com.rehome.meetingbook.bean; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-13 11:11 + * 描述:保存预约人员数据 + */ +public class CbsYYUsersResultBean { + //执行结果 (1成功,0失败,2发生异常) + private String result; + //提示信息 + private String msg; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/ContactListBean.java b/app/src/main/java/com/rehome/meetingbook/bean/ContactListBean.java new file mode 100644 index 0000000..de61893 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/ContactListBean.java @@ -0,0 +1,131 @@ +package com.rehome.meetingbook.bean; + + +import java.util.List; + + +/** + * Create By HuangWenFei + * 创建日期:2022-12-08 14:27 + * 描述:通讯录 + */ + +public class ContactListBean { + + + private List Rows; + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + /** + * DeptName : 厂领导 + * orderlist : [{"name":"高苑辉","telephone":"","address_tel":""},{"name":"张洪刚","telephone":"","address_tel":""},{"name":"石喜光","telephone":"","address_tel":""},{"name":"齐晓波","telephone":"","address_tel":""},{"name":"陈运强","telephone":"","address_tel":""}] + */ + + private String DeptName; + private List orderlist; + + public String getDeptName() { + return DeptName; + } + + public void setDeptName(String DeptName) { + this.DeptName = DeptName; + } + + public List getOrderlist() { + return orderlist; + } + + public void setOrderlist(List orderlist) { + this.orderlist = orderlist; + } + + public static class OrderlistBean { + /** + * name : 高苑辉 + * telephone : + * address_tel : + */ + + private String name; + private String telephone; + private String address_tel; + private String groupName; + private String man_id; + private String account_head; + + public OrderlistBean(String name, String telephone, String address_tel, String groupName, String man_id, String account_head) { + this.name = name; + this.telephone = telephone; + this.address_tel = address_tel; + this.groupName = groupName; + this.man_id = man_id; + this.account_head = account_head; + } + + public OrderlistBean(String groupName) { + this.groupName = groupName; + } + + public OrderlistBean() { + + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getAddress_tel() { + return address_tel; + } + + public void setAddress_tel(String address_tel) { + this.address_tel = address_tel; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getMan_id() { + return man_id; + } + + public void setMan_id(String man_id) { + this.man_id = man_id; + } + + public String getAccount_head() { + return account_head; + } + + public void setAccount_head(String account_head) { + this.account_head = account_head; + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/bean/DeptBean.java b/app/src/main/java/com/rehome/meetingbook/bean/DeptBean.java new file mode 100644 index 0000000..80ebe79 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/DeptBean.java @@ -0,0 +1,50 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * 部门 + */ +public class DeptBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + + private String deptname; + private String deptcode; + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDeptcode() { + return deptcode; + } + + public void setDeptcode(String deptcode) { + this.deptcode = deptcode; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/DeptBzBean.java b/app/src/main/java/com/rehome/meetingbook/bean/DeptBzBean.java new file mode 100644 index 0000000..51f1ed8 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/DeptBzBean.java @@ -0,0 +1,50 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * 班组 + */ +public class DeptBzBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + + private String deptname; + private String deptcode; + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDeptcode() { + return deptcode; + } + + public void setDeptcode(String deptcode) { + this.deptcode = deptcode; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/GridViewBean.java b/app/src/main/java/com/rehome/meetingbook/bean/GridViewBean.java new file mode 100644 index 0000000..2e4bec1 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/GridViewBean.java @@ -0,0 +1,47 @@ +package com.rehome.meetingbook.bean; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-25 19:35 + * 描述: + */ +public class GridViewBean { + + private String title; + private int imageid; + private int backgroup; + private boolean isShow; + + public int getImageid() { + return imageid; + } + + public void setImageid(int imageid) { + this.imageid = imageid; + } + + public int getBackgroup() { + return backgroup; + } + + public void setBackgroup(int backgroup) { + this.backgroup = backgroup; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + + public boolean isShow() { + return isShow; + } + + public void setShow(boolean show) { + isShow = show; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataBean.java b/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataBean.java new file mode 100644 index 0000000..8c1761a --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataBean.java @@ -0,0 +1,79 @@ +package com.rehome.meetingbook.bean; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-12 17:17 + * 描述: + */ +public class UploadCbsMainDataBean { + //承包商名称(全称) + private String cbsname; + //预约人手机号 + private String yyrdh; + //预约人姓名 + private String yyrxm; + //厂内项目负责人工号 + private String xxfzrid; + //厂内项目负责人姓名 + private String xxfzrname; + //培训考试模式ID + private String psmodel; + //是否为常委承包商(0否,1是) + private String iscw="0"; + + public String getCbsname() { + return cbsname; + } + + public void setCbsname(String cbsname) { + this.cbsname = cbsname; + } + + public String getYyrdh() { + return yyrdh; + } + + public void setYyrdh(String yyrdh) { + this.yyrdh = yyrdh; + } + + public String getYyrxm() { + return yyrxm; + } + + public void setYyrxm(String yyrxm) { + this.yyrxm = yyrxm; + } + + public String getXxfzrid() { + return xxfzrid; + } + + public void setXxfzrid(String xxfzrid) { + this.xxfzrid = xxfzrid; + } + + public String getXxfzrname() { + return xxfzrname; + } + + public void setXxfzrname(String xxfzrname) { + this.xxfzrname = xxfzrname; + } + + public String getPsmodel() { + return psmodel; + } + + public void setPsmodel(String psmodel) { + this.psmodel = psmodel; + } + + public String getIscw() { + return iscw; + } + + public void setIscw(String iscw) { + this.iscw = iscw; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataResultBean.java b/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataResultBean.java new file mode 100644 index 0000000..8f90eb2 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/UploadCbsMainDataResultBean.java @@ -0,0 +1,39 @@ +package com.rehome.meetingbook.bean; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-13 10:58 + * 描述:保存主数据 + */ +public class UploadCbsMainDataResultBean { + //执行结果 (1成功,0失败,2发生异常) + private String result; + //主数据ID + private String mainid; + //提示信息 + private String msg; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getMainid() { + return mainid; + } + + public void setMainid(String mainid) { + this.mainid = mainid; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/WorkMemberBean.java b/app/src/main/java/com/rehome/meetingbook/bean/WorkMemberBean.java new file mode 100644 index 0000000..5a3b05d --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/WorkMemberBean.java @@ -0,0 +1,69 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * 厂内人员信息 + */ +public class WorkMemberBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + + private String man_id; + private String name; + private String deptname; + private String deptcode; + + public String getMan_id() { + return man_id; + } + + public void setMan_id(String man_id) { + this.man_id = man_id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDeptcode() { + return deptcode; + } + + public void setDeptcode(String deptcode) { + this.deptcode = deptcode; + } + + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/bean/YunQingExalBean.java b/app/src/main/java/com/rehome/meetingbook/bean/YunQingExalBean.java new file mode 100644 index 0000000..f90c077 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/bean/YunQingExalBean.java @@ -0,0 +1,73 @@ +package com.rehome.meetingbook.bean; + +import java.util.List; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-21 11:17 + * 描述: + */ +public class YunQingExalBean { + private String Total; + private List Rows; + + public String getTotal() { + return Total; + } + + public void setTotal(String Total) { + this.Total = Total; + } + + public List getRows() { + return Rows; + } + + public void setRows(List Rows) { + this.Rows = Rows; + } + + public static class RowsBean { + + //预约日期(格式:HH:mm) + private String rq; + //培训考试起始时间(格式:HH:mm) + private String times; + //培训考试结束时间(格式:HH:mm) + private String timee; + //预约总人数 + private String department_name; + + public String getRq() { + return rq; + } + + public void setRq(String rq) { + this.rq = rq; + } + + public String getTimes() { + return times; + } + + public void setTimes(String times) { + this.times = times; + } + + public String getTimee() { + return timee; + } + + public void setTimee(String timee) { + this.timee = timee; + } + + public String getDepartment_name() { + return department_name; + } + + public void setDepartment_name(String department_name) { + this.department_name = department_name; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/ui/activity/LoginActivity.java b/app/src/main/java/com/rehome/meetingbook/ui/activity/LoginActivity.java new file mode 100644 index 0000000..b8c392e --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/ui/activity/LoginActivity.java @@ -0,0 +1,192 @@ +package com.rehome.meetingbook.ui.activity; + + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbManager; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import com.rehome.meetingbook.MainActivity; +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.ZKUSBManager.ZKUSBManager; +import com.rehome.meetingbook.ZKUSBManager.ZKUSBManagerListener; +import com.rehome.meetingbook.base.BaseActivity2; +import com.rehome.meetingbook.databinding.ActivityLoginBinding; +import com.rehome.meetingbook.utils.ControllerActivity; +import com.rehome.meetingbook.weiget.CustomLoadingDialog; +import com.zkteco.android.biometric.core.device.ParameterHelper; +import com.zkteco.android.biometric.core.device.TransportType; +import com.zkteco.android.biometric.core.utils.LogHelper; +import com.zkteco.android.biometric.module.idcard.IDCardReader; +import com.zkteco.android.biometric.module.idcard.IDCardReaderFactory; +import com.zkteco.android.biometric.module.idcard.IDCardType; +import com.zkteco.android.biometric.module.idcard.exception.IDCardReaderException; +import com.zkteco.android.biometric.module.idcard.meta.IDCardInfo; +import com.zkteco.android.biometric.module.idcard.meta.IDPRPCardInfo; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.widget.Toolbar; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 10:44 + * 描述:登录界面 + */ +public class LoginActivity extends BaseActivity2 { + + private long exitTime = 0; + + private String lastBtnCkick = "appointment"; // appointment search + + + + + private CustomLoadingDialog customDialog; + private String xm; + + + private final ActivityResultLauncher mAppointmentSearchStartActivityForResult = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + new ActivityResultCallback() { + @Override + public void onActivityResult(ActivityResult result) { + // 处理 result +// Intent data = result.getData(); +// if (data != null) { +// String idCardNo = data.getStringExtra("sfzh"); +// if (idCardNo != null) { +// Intent intent = new Intent(); +// intent.setClass(LoginActivity.this, AppointmentListActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); +// intent.putExtra("idCardNo", idCardNo); +// startActivity(intent); +// } +// } + } + } + ); + + + //隐藏 + @Override + protected void initView() { + + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); + binding.tvVersion.setText("版本号:" + getVersionName()); + + + binding.llCloseKey.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + hideKeyBoard(LoginActivity.this); + } + }); + + + + } + + @Override + protected void initData() { + + } + + @Override + protected ActivityLoginBinding getBinding() { + return ActivityLoginBinding.inflate(LayoutInflater.from(this)); + } + + @Override + protected Toolbar getToolbar() { + return binding.toolbarView.toolbar; + } + + + public void setBack() { + mToolbar.setNavigationIcon(R.mipmap.back); + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + } + + public static void hideKeyBoard(Activity activity) { + InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); + //Find the currently focused view, so we can grab the correct window token from it. + View view = activity.getCurrentFocus(); + //If no view currently has focus, create a new one, just so we can grab a window token from it + if (view == null) { + view = new View(activity); + } + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + + //身份证号码格式校验 + public boolean checkIdCardNoFormat(String idCardNo) { + String reg = "^\\d{15}$|^\\d{17}[0-9Xx]$"; + return idCardNo.matches(reg); + } + + + // 按两次返回键退出程序 + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK + && event.getAction() == KeyEvent.ACTION_DOWN) { + if ((System.currentTimeMillis() - exitTime) > 2000) { + showToast("再按一次退出程序"); + exitTime = System.currentTimeMillis(); + } else { + ControllerActivity.getAppManager().finishAllActivity(); + finish(); + System.exit(0); + //NohttpUtils.getInstance().cancelAll(); + } + return true; + } + return super.onKeyDown(keyCode, event); + } + + /** + * 获取版本名称:清单文件中 + * + * @return 应用版本名称 返回null代表异常 + */ + private String getVersionName() { + //1,包管理者对象packageManager + PackageManager pm = getPackageManager(); + //2,从包的管理者对象中,获取指定包名的基本信息(版本名称,版本号),传0代表获取基本信息 + try { + PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0); + //3,获取版本名称 + return packageInfo.versionName; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/ui/activity/SimpleActivity.java b/app/src/main/java/com/rehome/meetingbook/ui/activity/SimpleActivity.java new file mode 100644 index 0000000..0bf529d --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/ui/activity/SimpleActivity.java @@ -0,0 +1,341 @@ +package com.rehome.meetingbook.ui.activity; + +import androidx.appcompat.widget.Toolbar; + +import android.graphics.Color; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.CalendarView; +import com.rehome.meetingbook.Contans; +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.adapter.AppointmentDateAdapter; +import com.rehome.meetingbook.adapter.YunQingExalAdapter; +import com.rehome.meetingbook.base.BaseActivity2; +import com.rehome.meetingbook.bean.AppointmentDateDetailListBean; +import com.rehome.meetingbook.bean.AppointmentDateListBean; +import com.rehome.meetingbook.bean.AppointmentLevelBean; +import com.rehome.meetingbook.bean.YunQingExalBean; +import com.rehome.meetingbook.databinding.ActivitySimpleBinding; +import com.rehome.meetingbook.utils.GsonUtils; +import com.rehome.meetingbook.utils.HttpListener; +import com.rehome.meetingbook.utils.NoProgresshttpUtils; +import com.rehome.meetingbook.utils.StatusBarUtil; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.RequestMethod; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.Response; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SimpleActivity extends BaseActivity2implements + CalendarView.OnCalendarSelectListener, + CalendarView.OnYearChangeListener{ + + private int mYear; + + //培训考试模式 + private List appointmentExamModel; + //日常培训考试 + private List daylyExamList; + private AppointmentDateAdapter daylyAdapter; + //运行部考试 + private List yqExalList; + private YunQingExalAdapter yqExalAdapter; + + @Override + protected ActivitySimpleBinding getBinding() { + return ActivitySimpleBinding.inflate(LayoutInflater.from(this)); + } + + @Override + protected Toolbar getToolbar() { + return binding.toolbarView.toolbar; + } + + @Override + protected void initView() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + StatusBarUtil.setColor(SimpleActivity.this, Color.parseColor("#138CF2")); + binding.toolbarView.title.setText("预约一览"); + setExitZx(); + + appointmentExamModel = new ArrayList<>(); + daylyExamList = new ArrayList<>(); + yqExalList = new ArrayList<>(); + daylyAdapter = new AppointmentDateAdapter(SimpleActivity.this,daylyExamList); + yqExalAdapter = new YunQingExalAdapter(SimpleActivity.this,yqExalList); + binding.lvAppointmentDayly.setAdapter(daylyAdapter); + binding.lvAppointmentYy.setAdapter(yqExalAdapter); + + + mYear = binding.calendarView.getCurYear(); + binding.tvYear.setText(String.valueOf(binding.calendarView.getCurYear())); + binding.flCurrent.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.calendarView.scrollToCurrent(); + } + }); + + binding.tvMonthDay.setText(binding.calendarView.getCurMonth() + "月" + binding.calendarView.getCurDay() + "日"); + binding.tvLunar.setText("今日"); + binding.tvCurrentDay.setText(String.valueOf(binding.calendarView.getCurDay())); + + binding.calendarView.setOnYearChangeListener(this); + binding.calendarView.setOnCalendarSelectListener(this); + } + + @Override + protected void initData() { + +// int year = binding.calendarView.getCurYear(); +// int month = binding.calendarView.getCurMonth(); +// +// Map map = new HashMap<>(); +// map.put(getSchemeCalendar(year, month, 3, 0xFF40db25, "假").toString(), +// getSchemeCalendar(year, month, 3, 0xFF40db25, "假")); +// map.put(getSchemeCalendar(year, month, 6, 0xFF40db25, "事").toString(), +// getSchemeCalendar(year, month, 6, 0xFF40db25, "事")); +// map.put(getSchemeCalendar(year, month, 9, 0xFF40db25, "议").toString(), +// getSchemeCalendar(year, month, 9, 0xFF40db25, "议")); +// map.put(getSchemeCalendar(year, month, 13, 0xFF40db25, "记").toString(), +// getSchemeCalendar(year, month, 13, 0xFF40db25, "记")); +// map.put(getSchemeCalendar(year, month, 14, 0xFF40db25, "记").toString(), +// getSchemeCalendar(year, month, 14, 0xFF40db25, "记")); +// map.put(getSchemeCalendar(year, month, 15, 0xFF40db25, "假").toString(), +// getSchemeCalendar(year, month, 15, 0xFF40db25, "假")); +// map.put(getSchemeCalendar(year, month, 18, 0xFF40db25, "记").toString(), +// getSchemeCalendar(year, month, 18, 0xFF40db25, "记")); +// map.put(getSchemeCalendar(year, month, 25, 0xFF40db25, "假").toString(), +// getSchemeCalendar(year, month, 25, 0xFF40db25, "假")); +// map.put(getSchemeCalendar(year, month, 27, 0xFF40db25, "多").toString(), +// getSchemeCalendar(year, month, 27, 0xFF40db25, "多")); +// //此方法在巨大的数据量上不影响遍历性能,推荐使用 +// binding.calendarView.setSchemeDate(map); + + //获取培训考试模式 + getExamModel(); + } + + private Calendar getSchemeCalendar(int year, int month, int day, int color, String text) { + Calendar calendar = new Calendar(); + calendar.setYear(year); + calendar.setMonth(month); + calendar.setDay(day); + calendar.setSchemeColor(color);//如果单独标记颜色、则会使用这个颜色 + calendar.setScheme(text); + return calendar; + } + + private void setExitZx() { + mToolbar.setNavigationIcon(R.mipmap.back); + mToolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @Override + public void onCalendarOutOfRange(Calendar calendar) { + + } + + @Override + public void onCalendarSelect(Calendar calendar, boolean isClick) { + binding.tvLunar.setVisibility(View.VISIBLE); + binding.tvYear.setVisibility(View.VISIBLE); + binding.tvMonthDay.setText(calendar.getMonth() + "月" + calendar.getDay() + "日"); + binding.tvYear.setText(String.valueOf(calendar.getYear())); + binding.tvLunar.setText(calendar.getLunar()); + mYear = calendar.getYear(); + Log.i("app","onCalendarSelect"); + Log.i("app",String.valueOf(calendar.getYear())+"-"+String.valueOf(calendar.getMonth())+"-"+calendar.getDay()); + + getDateDetailList(String.valueOf(calendar.getYear())+"-"+String.format("%02d", calendar.getMonth())+"-"+String.format("%02d", calendar.getDay())); + //获取生产岗位培训室使用时间 + getScgwDateDetailList(String.valueOf(calendar.getYear())+"-"+String.format("%02d", calendar.getMonth())+"-"+String.format("%02d", calendar.getDay())); + + + } + + @Override + public void onYearChange(int year) { + binding.tvMonthDay.setText(String.valueOf(year)); + } + + private void getExamModel() { + + String url = Contans.BASE_URL + Contans.GET_YYTYPEANDEXAMMODEL_URL + "PSKSMS"; + Log.i("app", url); + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NoProgresshttpUtils.getInstance().add(0, request, new HttpListener() { + + @Override + public void onSucceed(int what, Response response) { + + Log.i("app", "----------------"); + String result = response.get(); + Log.i("app", result); + + AppointmentLevelBean bean = GsonUtils.GsonToBean(result, AppointmentLevelBean.class); + if (bean != null && bean.getRows() != null && bean.getRows().size() > 0) { + appointmentExamModel.clear(); + appointmentExamModel.addAll(bean.getRows()); + //获取有预约的日期(从当前时间起) + getDateList(); + } + } + + @Override + public void onFailed(int what, Response response) { + + } + }); + } + //获取有预约的日期(从当前时间起) + private void getDateList() { + + String url = Contans.BASE_URL + Contans.GET_YYDATE_URL; + Log.i("app", url); + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NoProgresshttpUtils.getInstance().add(0, request, new HttpListener() { + + @Override + public void onSucceed(int what, Response response) { + + Log.i("app", "----------------"); + String result = response.get(); + Log.i("app", result); + + AppointmentDateListBean bean = GsonUtils.GsonToBean(result, AppointmentDateListBean.class); + if (bean != null) { + if (bean.getRows() != null && bean.getRows().size() > 0) { + Map map = new HashMap<>(); + for (AppointmentDateListBean.RowsBean item:bean.getRows()) { + if(!TextUtils.isEmpty(item.getYyrq())){ + String year = item.getYyrq().substring(0,4); + String month = item.getYyrq().substring(5,7); + String day = item.getYyrq().substring(8,10); + map.put(getSchemeCalendar(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),0xFF40db25,"假").toString(), + getSchemeCalendar(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day),0xFF40db25,"假")); + } + } + //此方法在巨大的数据量上不影响遍历性能,推荐使用 + binding.calendarView.setSchemeDate(map); +// //获取每天预约详细 +// getDateDetailList(bean.getRows().get(0).getYyrq()); +// //获取生产岗位培训室使用时间 +// getScgwDateDetailList(bean.getRows().get(0).getYyrq()); + + binding.calendarView.scrollToCurrent(); + } + } else { + showToast("预约数据"); + } + } + + @Override + public void onFailed(int what, Response response) { + + } + }); + } + + //获取每天预约详细 + private void getDateDetailList(String dateStr) { + + binding.tvTimeDay1.setText(dateStr+":"); + binding.tvTimeDay3.setText(dateStr+":"); + String url = Contans.BASE_URL + Contans.GET_YYDATEDETAILLIST_URL+dateStr; + Log.i("app", url); + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NoProgresshttpUtils.getInstance().add(0, request, new HttpListener() { + + @Override + public void onSucceed(int what, Response response) { + + Log.i("app", "----------------"); + String result = response.get(); + Log.i("app", result); + + AppointmentDateDetailListBean bean = GsonUtils.GsonToBean(result, AppointmentDateDetailListBean.class); + if (bean != null) { + if (bean.getRows() != null && bean.getRows().size() > 0) { + if(appointmentExamModel.size()>0){ + String idDayly = ""; + daylyExamList.clear(); + for (AppointmentLevelBean.RowsBean modelItem:appointmentExamModel) { + if(modelItem.getText().equals("日常培训考试")){ + idDayly = modelItem.getId(); + } + } + for (AppointmentDateDetailListBean.RowsBean item:bean.getRows()) { + if(item.getPsmodel().equals(idDayly)){ + daylyExamList.add(item); + } + } + daylyAdapter.notifyDataSetChanged(); + } + }else{ + daylyExamList.clear(); + daylyAdapter.notifyDataSetChanged(); + } + } + } + + @Override + public void onFailed(int what, Response response) { + + } + }); + } + //获取每天预约详细 + private void getScgwDateDetailList(String dateStr) { + + String url = Contans.BASE_URL + Contans.GET_YYDATESCGW_URL+dateStr; + Log.i("app", url); + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NoProgresshttpUtils.getInstance().add(0, request, new HttpListener() { + + @Override + public void onSucceed(int what, Response response) { + + Log.i("app", "----------------"); + String result = response.get(); + Log.i("app", result); + + YunQingExalBean bean = GsonUtils.GsonToBean(result, YunQingExalBean.class); + if (bean != null) { + if (bean.getRows() != null && bean.getRows().size() > 0) { + yqExalList.clear(); + yqExalList.addAll(bean.getRows()); + yqExalAdapter.notifyDataSetChanged(); + }else{ + yqExalList.clear(); + yqExalAdapter.notifyDataSetChanged(); + } + } + } + + @Override + public void onFailed(int what, Response response) { + + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/ui/fragment/BaseFragment.java b/app/src/main/java/com/rehome/meetingbook/ui/fragment/BaseFragment.java new file mode 100644 index 0000000..4a55750 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/ui/fragment/BaseFragment.java @@ -0,0 +1,52 @@ +package com.rehome.meetingbook.ui.fragment; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewbinding.ViewBinding; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-06 17:36 + * 描述: + */ +public abstract class BaseFragment extends Fragment { + + protected Context context; + + protected T binding; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + binding = getBinding(inflater, container); + return binding.getRoot(); + } + + protected abstract T getBinding(LayoutInflater inflater, ViewGroup container); + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + this.context = context; + } + + @Override + public void onDetach() { + super.onDetach(); + this.context = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/utils/ContactDatas.java b/app/src/main/java/com/rehome/meetingbook/utils/ContactDatas.java new file mode 100644 index 0000000..cabbaee --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/ContactDatas.java @@ -0,0 +1,47 @@ +package com.rehome.meetingbook.utils; + + + +import com.rehome.meetingbook.bean.ContactListBean; + +import java.util.ArrayList; +import java.util.List; +/** + * Create By HuangWenFei + * 创建日期:2022-12-08 15:38 + * 描述: + */ +public class ContactDatas { + + public static List getContanctList(ContactListBean bean) { + + List orderlistBeanListEnd = new ArrayList<>(); + + List rowsBeanList = bean.getRows(); + + for (int i = 0; i < rowsBeanList.size(); i++) { + + ContactListBean.RowsBean rowsBean = rowsBeanList.get(i); + + if (rowsBean.getOrderlist() != null) { + + List orderlistBeanList = rowsBean.getOrderlist(); + + if (orderlistBeanList.size() != 0) { + + orderlistBeanListEnd.add(new ContactListBean.RowsBean.OrderlistBean("", "", "", rowsBean.getDeptName(),"","")); + + for (ContactListBean.RowsBean.OrderlistBean orderlistBean : orderlistBeanList) { + + orderlistBean.setGroupName(rowsBean.getDeptName()); + + } + + orderlistBeanListEnd.addAll(orderlistBeanList); + } + } + } + return orderlistBeanListEnd; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/utils/ControllerActivity.java b/app/src/main/java/com/rehome/meetingbook/utils/ControllerActivity.java new file mode 100644 index 0000000..d383f64 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/ControllerActivity.java @@ -0,0 +1,113 @@ +package com.rehome.meetingbook.utils; + + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; + +import java.util.Stack; + +/** + * Created by ruihong on 2017/10/28. + */ + +public class ControllerActivity { + //activity栈 + private static Stack activityStack; + //使用单例模式 + private static ControllerActivity instance; + + private ControllerActivity() { + } + + + public static ControllerActivity getAppManager() { + if (instance == null) { + instance = new ControllerActivity(); + } + return instance; + } + + /*** + * 添加Activity到栈 + * @param activity + */ + public void addActivity(Activity activity) { + if (activityStack == null) { + activityStack = new Stack(); + } + activityStack.add(activity); + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + public Activity currentActivity() { + + if (activityStack.size() == 0) { + return null; + } else { + Activity activity = activityStack.lastElement(); + return activity; + } + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + public void finishActivity() { + Activity activity = activityStack.lastElement(); + finishActivity(activity); + } + + /** + * 结束指定的Activity + */ + public void finishActivity(Activity activity) { + if (activity != null) { + activityStack.remove(activity); + activity.finish(); + activity = null; + } + } + + /** + * 结束指定类名的Activity + */ + public void finishActivity(Class cls) { + for (Activity activity : activityStack) { + if (activity.getClass().equals(cls)) { + finishActivity(activity); + break; + } + } + } + + /** + * 结束所有Activity + */ + public void finishAllActivity() { + for (int i = 0; i < activityStack.size(); i++) { + if (null != activityStack.get(i)) { + activityStack.get(i).finish(); + } + } + activityStack.clear(); + } + + /** + * 退出程序 + * + * @param context + */ + public void AppExit(Context context) { + try { + finishAllActivity(); + ActivityManager activityMgr = (ActivityManager) context + .getSystemService(Context.ACTIVITY_SERVICE); + activityMgr.killBackgroundProcesses(context.getPackageName()); + System.exit(0); + } catch (Exception e) { + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/utils/GsonUtils.java b/app/src/main/java/com/rehome/meetingbook/utils/GsonUtils.java new file mode 100644 index 0000000..ff7199f --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/GsonUtils.java @@ -0,0 +1,134 @@ +package com.rehome.meetingbook.utils; + + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + + +/** + * Create By HuangWenFei + * 创建日期:2022-12-01 15:36 + * 描述:gson工具类,封装GSON + */ +public class GsonUtils { + + private static Gson gson = null; + + static { + if (gson == null) { + gson = new Gson(); + } + } + + private GsonUtils() { + } + + /** + * 转成json + * + * @param object + * @return + */ + public static String GsonString(Object object) { + String gsonString = null; + if (gson != null) { + gsonString = gson.toJson(object); + } + return gsonString; + } + + /** + * 转成bean + * + * @param gsonString + * @param cls + * @return + */ + public static T GsonToBean(String gsonString, Class cls) { + T t = null; + if (gson != null) { + try { + t = gson.fromJson(gsonString, cls); + } catch (Exception e) { + e.printStackTrace(); + } + } + return t; + } + + /** + * 转成list + * 泛型在编译期类型被擦除导致报错 + * + * @param gsonString + * @param cls + * @return + */ + public static List GsonToList(String gsonString, Class cls) { + List list = null; + if (gson != null) { + list = gson.fromJson(gsonString, new TypeToken>() { + }.getType()); + } + return list; + } + + /** + * 转成list + * 解决泛型问题 + * + * @param json + * @param cls + * @param + * @return + */ + public List jsonToList(String json, Class cls) { + Gson gson = new Gson(); + List list = new ArrayList(); + JsonArray array = new JsonParser().parse(json).getAsJsonArray(); + for (final JsonElement elem : array) { + list.add(gson.fromJson(elem, cls)); + } + return list; + } + + + /** + * 转成list中有map的 + * + * @param gsonString + * @return + */ + public static List> GsonToListMaps(String gsonString) { + List> list = null; + if (gson != null) { + list = gson.fromJson(gsonString, + new TypeToken>>() { + }.getType()); + } + return list; + } + + /** + * 转成map的 + * + * @param gsonString + * @return + */ + public static Map GsonToMaps(String gsonString) { + Map map = null; + if (gson != null) { + map = gson.fromJson(gsonString, new TypeToken>() { + }.getType()); + } + return map; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/utils/HttpListener.java b/app/src/main/java/com/rehome/meetingbook/utils/HttpListener.java new file mode 100644 index 0000000..66d19bc --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/HttpListener.java @@ -0,0 +1,27 @@ +package com.rehome.meetingbook.utils; + + +import com.yolanda.nohttp.rest.Response; +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:29 + * 描述:NoHttp请求回调的接口 + */ +public interface HttpListener { + + /** + * 请求成功 + * + * @param what 请求队列的标志 + * @param response 请求结果 + */ + void onSucceed(int what, Response response); + + /** + * 请求失败 + * + * @param what 请求队列的标志 + * @param response 请求结果 + */ + void onFailed(int what, Response response); +} diff --git a/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListener.java b/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListener.java new file mode 100644 index 0000000..c567bad --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListener.java @@ -0,0 +1,140 @@ +package com.rehome.meetingbook.utils; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:27 + * 描述: + */ + +import android.app.Activity; +import android.content.DialogInterface; +import android.widget.Toast; + +import com.rehome.meetingbook.weiget.WaitDialog; +import com.yolanda.nohttp.Logger; +import com.yolanda.nohttp.error.NetworkError; +import com.yolanda.nohttp.error.TimeoutError; +import com.yolanda.nohttp.error.URLError; +import com.yolanda.nohttp.error.UnKnownHostError; +import com.yolanda.nohttp.rest.OnResponseListener; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.Response; + +/** + * NoHttp的封装 + */ +public class HttpResponseListener implements OnResponseListener { + + private final Activity mActivity; + + /** + * dialog + */ + private WaitDialog mDialog; + + /** + * 当前请求 + */ + private final Request mRequest; + + /** + * 请求回调 + */ + private final HttpListener callback; + + /** + * 是否显示dialog + */ + private final boolean isLoading; + + + /** + * @param mActivity 用来实例化dialog + * @param mRequest 请求 + * @param callback 请求回调 + * @param canCancel 是否允许用户请求 + * @param isLoading 是否显示dialog + */ + public HttpResponseListener(Activity mActivity, final Request mRequest, HttpListener callback, boolean canCancel, boolean isLoading, String msg) { + this.mActivity = mActivity; + this.mRequest = mRequest; + if (isLoading) { + mDialog = new WaitDialog(mActivity, msg); + mDialog.setCancelable(canCancel); + mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialogInterface) { + HttpResponseListener.this.mRequest.cancel();//取消请求 + } + }); + } + this.callback = callback; + this.isLoading = isLoading; + } + + /** + * 请求开始 + * + * @param what + */ + @Override + public void onStart(int what) { + + if (mDialog != null && !mDialog.isShowing() && !mActivity.isFinishing()) { + mDialog.show(); + } + } + + /** + * 成功回调 + * + * @param what + * @param response + */ + @Override + public void onSucceed(int what, Response response) { + if (callback != null) { + callback.onSucceed(what, response); + } + } + + /** + * 失败回调 + * + * @param what + * @param response + */ + @Override + public void onFailed(int what, Response response) { + + Exception exception = response.getException(); + if (mActivity != null) { + if (exception instanceof NetworkError) {// 网络不好 + Toast.makeText(mActivity, "网络异常", Toast.LENGTH_SHORT).show(); + } else if (exception instanceof TimeoutError) {// 请求超时 + Toast.makeText(mActivity, "请求超时", Toast.LENGTH_SHORT).show(); + } else if (exception instanceof UnKnownHostError) {// 找不到服务器 + Toast.makeText(mActivity, "找不到服务器", Toast.LENGTH_SHORT).show(); + } else if (exception instanceof URLError) {// URL是错的 + Toast.makeText(mActivity, "url出错", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(mActivity, "网络连接超时", Toast.LENGTH_SHORT).show(); + } + } + Logger.e("错误:" + exception.getMessage()); + if (callback != null) + callback.onFailed(what, response); + } + + /** + * 请求结束 + * + * @param what + */ + @Override + public void onFinish(int what) { + if (mDialog != null && mDialog.isShowing()) { + mDialog.dismiss(); + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListenerNoProgress.java b/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListenerNoProgress.java new file mode 100644 index 0000000..372feb2 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/HttpResponseListenerNoProgress.java @@ -0,0 +1,86 @@ +package com.rehome.meetingbook.utils; + + +import com.yolanda.nohttp.rest.OnResponseListener; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.Response; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:31 + * 描述:NoHttp的封装 + */ + +public class HttpResponseListenerNoProgress implements OnResponseListener { + + + /** + * 当前请求 + */ + private Request mRequest; + + /** + * 请求回调 + */ + private HttpListener callback; + + + + /** + * + * @param mRequest 请求 + * @param callback 请求回调 + */ + public HttpResponseListenerNoProgress(final Request mRequest, HttpListener callback) { + this.mRequest = mRequest; + this.callback = callback; + } + + /** + * 请求开始 + * + * @param what + */ + @Override + public void onStart(int what) { + + } + + /** + * 成功回调 + * + * @param what + * @param response + */ + @Override + public void onSucceed(int what, Response response) { + if (callback != null) { + try { + callback.onSucceed(what, response); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 失败回调 + * + * @param what + * @param response + */ + @Override + public void onFailed(int what, Response response) { + if (callback != null) + callback.onFailed(what, response); + } + + /** + * 请求结束 + * + * @param what + */ + @Override + public void onFinish(int what) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/utils/NoProgresshttpUtils.java b/app/src/main/java/com/rehome/meetingbook/utils/NoProgresshttpUtils.java new file mode 100644 index 0000000..949a494 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/NoProgresshttpUtils.java @@ -0,0 +1,116 @@ +package com.rehome.meetingbook.utils; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:30 + * 描述: + */ + +import android.content.Context; +import com.rehome.meetingbook.R; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.download.DownloadQueue; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.RequestQueue; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.security.cert.CertificateFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManagerFactory; + +/** + * Nohttp工具类 + */ +public class NoProgresshttpUtils { + + private static NoProgresshttpUtils sUtils; + private RequestQueue mQueue; + + /** + * 下载队列. + */ + private static DownloadQueue downloadQueue; + + private NoProgresshttpUtils() { + mQueue = NoHttp.newRequestQueue(8); + } + + /** + * DCL单例模式 双层锁 + * + * @return + */ + public static NoProgresshttpUtils getInstance() { + if (sUtils == null) { + synchronized (NohttpUtils.class) { + if (sUtils == null) { + sUtils = new NoProgresshttpUtils(); + } + } + } + return sUtils; + } + + /** + * 下载队列. + */ + public static DownloadQueue getDownloadInstance() { + if (downloadQueue == null) + downloadQueue = NoHttp.newDownloadQueue(1); + return downloadQueue; + } + + + public void add(int what, Request request, HttpListener callback) { + mQueue.add(what, request, new HttpResponseListenerNoProgress(request, callback)); + } + + /** + * 取消这个sign这个标记的所有请求 + * + * @param sign + */ + public void cancelBySign(Object sign) { + mQueue.cancelBySign(sign); + } + + /** + * 取消队列中所有请求 + */ + public void cancelAll() { + mQueue.cancelAll(); + } + + /** + * 退出App停止所有请求 + */ + public void stopAll() { + mQueue.stop(); + } + + public static SSLSocketFactory getSSLSocketFactory(Context context){ + try { + CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + keyStore.load(null); + String certificateAlias = Integer.toString(0); + keyStore.setCertificateEntry(certificateAlias, certificateFactory. + generateCertificate(context.getResources().openRawResource(R.raw.ca1))); + SSLContext sslContext = SSLContext.getInstance("TLS"); + final TrustManagerFactory trustManagerFactory = + TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(keyStore); + sslContext.init + ( + null, + trustManagerFactory.getTrustManagers(), + new SecureRandom() + ); + return sslContext.getSocketFactory(); + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/utils/NohttpUtils.java b/app/src/main/java/com/rehome/meetingbook/utils/NohttpUtils.java new file mode 100644 index 0000000..8984d0e --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/NohttpUtils.java @@ -0,0 +1,101 @@ +package com.rehome.meetingbook.utils; + + +import android.app.Activity; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.download.DownloadQueue; +import com.yolanda.nohttp.rest.Request; +import com.yolanda.nohttp.rest.RequestQueue; + + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:26 + * 描述: + */ +public class NohttpUtils { + private static NohttpUtils sUtils; + private final RequestQueue mQueue; + + /** + * 下载队列. + */ + private static DownloadQueue downloadQueue; + + private NohttpUtils() { + mQueue = NoHttp.newRequestQueue(8); + } + + /** + * DCL单例模式 双层锁 + * + * @return + */ + public static NohttpUtils getInstance() { + if (sUtils == null) { + synchronized (NohttpUtils.class) { + if (sUtils == null) { + sUtils = new NohttpUtils(); + } + } + } + return sUtils; + } + + /** + * 下载队列. + */ + public static DownloadQueue getDownloadInstance() { + if (downloadQueue == null) + downloadQueue = NoHttp.newDownloadQueue(1); + return downloadQueue; + } + + + /** + * 添加请求 + * + * @param mActivity activity + * @param what 请求码,用来区分队列中的请求 + * @param request 请求 + * @param callback 请求回调 + * @param canCanel 是否可以取消请求 + * @param isLoading 是否弹出对话框 + * @param + */ + public void add(Activity mActivity, int what, Request request, HttpListener callback, boolean canCanel, boolean isLoading, String msg) { + mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, canCanel, isLoading, msg)); + } + + + public void add(Activity mActivity, int what, Request request, HttpListener callback) { + mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, "加载中...")); + } + + public void add(Activity mActivity, int what,String progressTitle, Request request, HttpListener callback) { + mQueue.add(what, request, new HttpResponseListener(mActivity, request, callback, true, true, progressTitle)); + } + + /** + * 取消这个sign这个标记的所有请求 + * + * @param sign + */ + public void cancelBySign(Object sign) { + mQueue.cancelBySign(sign); + } + + /** + * 取消队列中所有请求 + */ + public void cancelAll() { + mQueue.cancelAll(); + } + + /** + * 退出App停止所有请求 + */ + public void stopAll() { + mQueue.stop(); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/utils/StatusBarUtil.java b/app/src/main/java/com/rehome/meetingbook/utils/StatusBarUtil.java new file mode 100644 index 0000000..6bfb343 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/utils/StatusBarUtil.java @@ -0,0 +1,833 @@ +package com.rehome.meetingbook.utils; + + +import android.annotation.SuppressLint; +import android.annotation.TargetApi; +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import androidx.annotation.ColorInt; +import androidx.annotation.IntRange; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.drawerlayout.widget.DrawerLayout; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; + +import com.rehome.meetingbook.R; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + + +/** + * @author 47184 on 2018/2/27. + */ + +public class StatusBarUtil { + + + public static final int DEFAULT_STATUS_BAR_ALPHA = 0; + private static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view; + private static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view; + private static final int TAG_KEY_HAVE_SET_OFFSET = -123; + + /** + * 修改状态栏为全透明 + * + * @param activity + */ + @TargetApi(19) + public static void transparencyBar(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = activity.getWindow(); + window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + Window window = activity.getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + + + /** + * 设置状态栏颜色 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + public static void setColor(Activity activity, @ColorInt int color) { + setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 设置状态栏颜色 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + * @param statusBarAlpha 状态栏透明度 + */ + + public static void setColor(Activity activity, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha)); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + if (fakeStatusBarView.getVisibility() == View.GONE) { + fakeStatusBarView.setVisibility(View.VISIBLE); + } + fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } else { + decorView.addView(createStatusBarView(activity, color, statusBarAlpha)); + } + setRootView(activity); + } + } + + /** + * 为滑动返回界面设置状态栏颜色 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + */ + public static void setColorForSwipeBack(Activity activity, int color) { + setColorForSwipeBack(activity, color, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 为滑动返回界面设置状态栏颜色 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + * @param statusBarAlpha 状态栏透明度 + */ + public static void setColorForSwipeBack(Activity activity, @ColorInt int color, + @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + + ViewGroup contentView = activity.findViewById(android.R.id.content); + View rootView = contentView.getChildAt(0); + int statusBarHeight = getStatusBarHeight(activity); + if (rootView != null && rootView instanceof CoordinatorLayout) { + final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) rootView; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + coordinatorLayout.setFitsSystemWindows(false); + contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + boolean isNeedRequestLayout = contentView.getPaddingTop() < statusBarHeight; + if (isNeedRequestLayout) { + contentView.setPadding(0, statusBarHeight, 0, 0); + coordinatorLayout.post(new Runnable() { + @Override + public void run() { + coordinatorLayout.requestLayout(); + } + }); + } + } else { + coordinatorLayout.setStatusBarBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } + } else { + contentView.setPadding(0, statusBarHeight, 0, 0); + contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); + } + setTransparentForWindow(activity); + } + } + + /** + * 设置状态栏纯色 不加半透明效果 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + public static void setColorNoTranslucent(Activity activity, @ColorInt int color) { + setColor(activity, color, 0); + } + + /** + * 设置状态栏颜色(5.0以下无半透明效果,不建议使用) + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + */ + @Deprecated + public static void setColorDiff(Activity activity, @ColorInt int color) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + transparentStatusBar(activity); + ViewGroup contentView = activity.findViewById(android.R.id.content); + // 移除半透明矩形,以免叠加 + View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + if (fakeStatusBarView.getVisibility() == View.GONE) { + fakeStatusBarView.setVisibility(View.VISIBLE); + } + fakeStatusBarView.setBackgroundColor(color); + } else { + contentView.addView(createStatusBarView(activity, color)); + } + setRootView(activity); + } + + /** + * 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + */ + public static void setTranslucent(Activity activity) { + setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + */ + public static void setTranslucent(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + setTransparent(activity); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 针对根布局是 CoordinatorLayout, 使状态栏半透明 + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + */ + public static void setTranslucentForCoordinatorLayout(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + transparentStatusBar(activity); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 设置状态栏全透明 + * + * @param activity 需要设置的activity + */ + public static void setTransparent(Activity activity) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + transparentStatusBar(activity); + setRootView(activity); + } + + /** + * 使状态栏透明(5.0以上半透明效果,不建议使用) + *

+ * 适用于图片作为背景的界面,此时需要图片填充到状态栏 + * + * @param activity 需要设置的activity + */ + @Deprecated + public static void setTranslucentDiff(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // 设置状态栏透明 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + setRootView(activity); + } + } + + /** + * 为DrawerLayout 布局设置状态栏变色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 为DrawerLayout 布局设置状态栏颜色,纯色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + setColorForDrawerLayout(activity, drawerLayout, color, 0); + } + + /** + * 为DrawerLayout 布局设置状态栏变色 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + * @param statusBarAlpha 状态栏透明度 + */ + public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color, + @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + // 生成一个状态栏大小的矩形 + // 添加 statusBarView 到布局中 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + if (fakeStatusBarView.getVisibility() == View.GONE) { + fakeStatusBarView.setVisibility(View.VISIBLE); + } + fakeStatusBarView.setBackgroundColor(color); + } else { + contentLayout.addView(createStatusBarView(activity, color), 0); + } + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1) + .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(), + contentLayout.getPaddingRight(), contentLayout.getPaddingBottom()); + } + // 设置属性 + setDrawerLayoutProperty(drawerLayout, contentLayout); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 设置 DrawerLayout 属性 + * + * @param drawerLayout DrawerLayout + * @param drawerLayoutContentLayout DrawerLayout 的内容布局 + */ + private static void setDrawerLayoutProperty(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) { + ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1); + drawerLayout.setFitsSystemWindows(false); + drawerLayoutContentLayout.setFitsSystemWindows(false); + drawerLayoutContentLayout.setClipToPadding(true); + drawer.setFitsSystemWindows(false); + } + + /** + * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用) + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + * @param color 状态栏颜色值 + */ + @Deprecated + public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 生成一个状态栏大小的矩形 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + if (fakeStatusBarView.getVisibility() == View.GONE) { + fakeStatusBarView.setVisibility(View.VISIBLE); + } + fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA)); + } else { + // 添加 statusBarView 到布局中 + contentLayout.addView(createStatusBarView(activity, color), 0); + } + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0); + } + // 设置属性 + setDrawerLayoutProperty(drawerLayout, contentLayout); + } + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) { + setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, + @IntRange(from = 0, to = 255) int statusBarAlpha) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + setTransparentForDrawerLayout(activity, drawerLayout); + addTranslucentView(activity, statusBarAlpha); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明 + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + // 内容布局不是 LinearLayout 时,设置padding top + if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { + contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0); + } + + // 设置属性 + setDrawerLayoutProperty(drawerLayout, contentLayout); + } + + /** + * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用) + * + * @param activity 需要设置的activity + * @param drawerLayout DrawerLayout + */ + @Deprecated + public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + // 设置状态栏透明 + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + // 设置内容布局属性 + ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); + contentLayout.setFitsSystemWindows(true); + contentLayout.setClipToPadding(true); + // 设置抽屉布局属性 + ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1); + vg.setFitsSystemWindows(false); + // 设置 DrawerLayout 属性 + drawerLayout.setFitsSystemWindows(false); + } + } + + /** + * 为头部是 ImageView 的界面设置状态栏全透明 + * + * @param activity 需要设置的activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTransparentForImageView(Activity activity, View needOffsetView) { + setTranslucentForImageView(activity, 0, needOffsetView); + } + + /** + * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度) + * + * @param activity 需要设置的activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageView(Activity activity, View needOffsetView) { + setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); + } + + /** + * 为头部是 ImageView 的界面设置状态栏透明 + * + * @param activity 需要设置的activity + * @param statusBarAlpha 状态栏透明度 + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha, + View needOffsetView) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return; + } + setTransparentForWindow(activity); + addTranslucentView(activity, statusBarAlpha); + if (needOffsetView != null) { + Object haveSetOffset = needOffsetView.getTag(TAG_KEY_HAVE_SET_OFFSET); + if (haveSetOffset != null && (Boolean) haveSetOffset) { + return; + } + ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); + layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity), + layoutParams.rightMargin, layoutParams.bottomMargin); + needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, true); + } + } + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) { + setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView); + } + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) { + setTranslucentForImageViewInFragment(activity, 0, needOffsetView); + } + + /** + * 为 fragment 头部是 ImageView 的设置状态栏透明 + * + * @param activity fragment 对应的 activity + * @param statusBarAlpha 状态栏透明度 + * @param needOffsetView 需要向下偏移的 View + */ + public static void setTranslucentForImageViewInFragment(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha, + View needOffsetView) { + setTranslucentForImageView(activity, statusBarAlpha, needOffsetView); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + clearPreviousSetting(activity); + } + } + + /** + * 隐藏伪状态栏 View + * + * @param activity 调用的 Activity + */ + public static void hideFakeStatusBarView(Activity activity) { + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + fakeStatusBarView.setVisibility(View.GONE); + } + View fakeTranslucentView = decorView.findViewById(FAKE_TRANSLUCENT_VIEW_ID); + if (fakeTranslucentView != null) { + fakeTranslucentView.setVisibility(View.GONE); + } + } + + /////////////////////////////////////////////////////////////////////////////////// + + @TargetApi(Build.VERSION_CODES.KITKAT) + private static void clearPreviousSetting(Activity activity) { + ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); + View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); + if (fakeStatusBarView != null) { + decorView.removeView(fakeStatusBarView); + ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0); + rootView.setPadding(0, 0, 0, 0); + } + } + + /** + * 添加半透明矩形条 + * + * @param activity 需要设置的 activity + * @param statusBarAlpha 透明值 + */ + private static void addTranslucentView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) { + ViewGroup contentView = activity.findViewById(android.R.id.content); + View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID); + if (fakeTranslucentView != null) { + if (fakeTranslucentView.getVisibility() == View.GONE) { + fakeTranslucentView.setVisibility(View.VISIBLE); + } + fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0)); + } else { + contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha)); + } + } + + /** + * 生成一个和状态栏大小相同的彩色矩形条 + * + * @param activity 需要设置的 activity + * @param color 状态栏颜色值 + * @return 状态栏矩形条 + */ + private static View createStatusBarView(Activity activity, @ColorInt int color) { + return createStatusBarView(activity, color, 0); + } + + /** + * 生成一个和状态栏大小相同的半透明矩形条 + * + * @param activity 需要设置的activity + * @param color 状态栏颜色值 + * @param alpha 透明值 + * @return 状态栏矩形条 + */ + private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) { + // 绘制一个和状态栏一样高的矩形 + View statusBarView = new View(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(calculateStatusColor(color, alpha)); + statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID); + return statusBarView; + } + + /** + * 设置根布局参数 + */ + private static void setRootView(Activity activity) { + ViewGroup parent = activity.findViewById(android.R.id.content); + for (int i = 0, count = parent.getChildCount(); i < count; i++) { + View childView = parent.getChildAt(i); + if (childView instanceof ViewGroup) { + childView.setFitsSystemWindows(true); + ((ViewGroup) childView).setClipToPadding(true); + } + } + } + + /** + * 设置透明 + */ + private static void setTransparentForWindow(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + activity.getWindow() + .getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + activity.getWindow() + .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + /** + * 使状态栏透明 + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + private static void transparentStatusBar(Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } else { + activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + } + } + + /** + * 创建半透明矩形 View + * + * @param alpha 透明值 + * @return 半透明 View + */ + private static View createTranslucentStatusBarView(Activity activity, int alpha) { + // 绘制一个和状态栏一样高的矩形 + View statusBarView = new View(activity); + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); + statusBarView.setLayoutParams(params); + statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0)); + statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID); + return statusBarView; + } + + /** + * 获取状态栏高度 + * + * @param context context + * @return 状态栏高度 + */ + private static int getStatusBarHeight(Context context) { + // 获得状态栏高度 + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + return context.getResources().getDimensionPixelSize(resourceId); + } + + /** + * 计算状态栏颜色 + * + * @param color color值 + * @param alpha alpha值 + * @return 最终的状态栏颜色 + */ + private static int calculateStatusColor(@ColorInt int color, int alpha) { + if (alpha == 0) { + return color; + } + float a = 1 - alpha / 255f; + int red = color >> 16 & 0xff; + int green = color >> 8 & 0xff; + int blue = color & 0xff; + red = (int) (red * a + 0.5); + green = (int) (green * a + 0.5); + blue = (int) (blue * a + 0.5); + return 0xff << 24 | red << 16 | green << 8 | blue; + } + + + /** + * 状态栏亮色模式,设置状态栏黑色文字、图标, + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @return 1:MIUUI 2:Flyme 3:android6.0 + */ + public static int StatusBarLightMode(Activity activity) { + int result = 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (MIUISetStatusBarLightMode(activity, true)) { + result = 1; + } else if (FlymeSetStatusBarLightMode(activity.getWindow(), true)) { + result = 2; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + result = 3; + } + } + return result; + } + + /** + * 已知系统类型时,设置状态栏黑色文字、图标。 + * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android + * + * @param activity + * @param type 1:MIUUI 2:Flyme 3:android6.0 + */ + public static void StatusBarLightMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, true); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), true); + } else if (type == 3) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } + + } + + /** + * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标 + */ + public static void StatusBarDarkMode(Activity activity, int type) { + if (type == 1) { + MIUISetStatusBarLightMode(activity, false); + } else if (type == 2) { + FlymeSetStatusBarLightMode(activity.getWindow(), false); + } else if (type == 3) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + + } + + + /** + * 设置状态栏图标为深色和魅族特定的文字风格 + * 可以用来判断是否为Flyme用户 + * + * @param window 需要设置的窗口 + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean FlymeSetStatusBarLightMode(Window window, boolean dark) { + boolean result = false; + if (window != null) { + try { + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class + .getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + result = true; + } catch (Exception e) { + + } + } + return result; + } + + /** + * 需要MIUIV6以上 + * + * @param activity + * @param dark 是否把状态栏文字及图标颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean MIUISetStatusBarLightMode(Activity activity, boolean dark) { + boolean result = false; + Window window = activity.getWindow(); + if (window != null) { + Class clazz = window.getClass(); + try { + int darkModeFlag = 0; + @SuppressLint("PrivateApi") Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + if (dark) { + extraFlagField.invoke(window, darkModeFlag, darkModeFlag);//状态栏透明且黑色字体 + } else { + extraFlagField.invoke(window, 0, darkModeFlag);//清除黑色字体 + } + result = true; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上 + if (dark) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + } + } + } catch (Exception ignored) { + + } + } + return result; + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/AuditDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/AuditDialog.java new file mode 100644 index 0000000..3b23a38 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/AuditDialog.java @@ -0,0 +1,99 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-09 14:08 + * 描述: + */ + +import android.app.Dialog; +import android.content.Context; +import androidx.annotation.NonNull; +import android.text.TextUtils; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.TextView; + + +import com.rehome.meetingbook.R; + + +/** + * Created by Rehome-rjb1 on 2017/5/31. + * 是否审核的对话框 + */ + +public class AuditDialog extends Dialog { + + TextView tvMsg; + TextView dialogCancel; + TextView dialogCommit; + LinearLayout layDialogCancel; + + private AuditDialogListener listener; + + public AuditDialog(@NonNull Context context, String msg, AuditDialogListener listener) { + super(context); + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setBackgroundDrawableResource(android.R.color.transparent); + setContentView(R.layout.layout_audit_dialog); + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) / 3; + window.setGravity(Gravity.CENTER); + + tvMsg = findViewById(R.id.tv_msg); + dialogCancel = findViewById(R.id.dialog_cancel); + dialogCommit = findViewById(R.id.dialog_commit); + layDialogCancel = findViewById(R.id.lay_dialog_cancel); + + dialogCancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (listener != null) { + listener.cancel(); + } + } + }); + + dialogCommit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (listener != null) { + listener.confirm(); + } + } + }); + + this.listener = listener; + setCancelable(false); + setTvMsg(msg); + } + + + public void setTvMsg(String msg) { + if (!TextUtils.isEmpty(msg)) { + tvMsg.setText(msg); + } + } + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } + + public interface AuditDialogListener { + void confirm(); + + void cancel(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/AutoToolbar.java b/app/src/main/java/com/rehome/meetingbook/weiget/AutoToolbar.java new file mode 100644 index 0000000..fe0bab9 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/AutoToolbar.java @@ -0,0 +1,145 @@ +package com.rehome.meetingbook.weiget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.widget.TextView; + +import androidx.appcompat.widget.Toolbar; + +import com.rehome.meetingbook.R; +import com.zhy.autolayout.AutoLayoutInfo; +import com.zhy.autolayout.utils.AutoLayoutHelper; +import com.zhy.autolayout.utils.AutoUtils; +import com.zhy.autolayout.utils.DimenUtils; + +import java.lang.reflect.Field; + +/** + * Created by hupei on 2015/12/28 20:33. + */ +public class AutoToolbar extends Toolbar { + private static final int NO_VALID = -1; + private int mTextSize; + private int mSubTextSize; + private final AutoLayoutHelper mHelper = new AutoLayoutHelper(this); + + public AutoToolbar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Toolbar, + defStyleAttr, R.style.Widget_AppCompat_Toolbar); + + int titleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, + R.style.TextAppearance_Widget_AppCompat_Toolbar_Title); + + int subtitleTextAppearance = a.getResourceId(R.styleable.Toolbar_subtitleTextAppearance, + R.style.TextAppearance_Widget_AppCompat_Toolbar_Subtitle); + + mTextSize = loadTextSizeFromTextAppearance(titleTextAppearance); + mSubTextSize = loadTextSizeFromTextAppearance(subtitleTextAppearance); + + TypedArray menuA = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ActionBar, + defStyleAttr, R.style.ThemeOverlay_AppCompat); + int menuTextAppearance = menuA.getResourceId(R.styleable.AutoLayout_Layout_layout_auto_basewidth, + R.style.ThemeOverlay_AppCompat_ActionBar); + int menuTextSize = loadTextSizeFromTextAppearance(menuTextAppearance); + + //防止 menu 定义 textSize,而 Toolbar 无定义 textSize 时,title 的 textSize 随 menu 变化 + if (mTextSize == NO_VALID) mTextSize = menuTextSize; + if (mSubTextSize == NO_VALID) mSubTextSize = menuTextSize; + + a.recycle(); + menuA.recycle(); + } + + public AutoToolbar(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public AutoToolbar(Context context) { + this(context, null); + } + + private int loadTextSizeFromTextAppearance(int textAppearanceResId) { + TypedArray a = getContext().obtainStyledAttributes(textAppearanceResId, + R.styleable.TextAppearance); + try { + if (!DimenUtils.isPxVal(a.peekValue(R.styleable.TextAppearance_android_textSize))) + return NO_VALID; + return a.getDimensionPixelSize(R.styleable.TextAppearance_android_textSize, NO_VALID); + } finally { + a.recycle(); + } + } + + private void setUpTitleTextSize() { + CharSequence title = getTitle(); + if (!TextUtils.isEmpty(title) && mTextSize != NO_VALID) + setUpTitleTextSize("mTitleTextView", mTextSize); + CharSequence subtitle = getSubtitle(); + if (!TextUtils.isEmpty(subtitle) && mSubTextSize != NO_VALID) + setUpTitleTextSize("mSubtitleTextView", mSubTextSize); + } + + private void setUpTitleTextSize(String name, int val) { + try { + //反射 Toolbar 的 TextView + Field f = getClass().getSuperclass().getDeclaredField(name); + f.setAccessible(true); + TextView textView = (TextView) f.get(this); + if (textView != null) { + int autoTextSize = AutoUtils.getPercentHeightSize(val); + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoTextSize); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (!this.isInEditMode()) { + setUpTitleTextSize(); + this.mHelper.adjustChildren(); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(this.getContext(), attrs); + } + + public static class LayoutParams extends Toolbar.LayoutParams implements AutoLayoutHelper.AutoLayoutParams { + private AutoLayoutInfo mDimenLayoutInfo; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + this.mDimenLayoutInfo = AutoLayoutHelper.getAutoLayoutInfo(c, attrs); + } + + @Override + public AutoLayoutInfo getAutoLayoutInfo() { + return this.mDimenLayoutInfo; + } + + public LayoutParams(int width, int height) { + super(width, height); + } + + public LayoutParams(android.view.ViewGroup.LayoutParams source) { + super(source); + } + + public LayoutParams(MarginLayoutParams source) { + super(source); + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/CbsMemberAlertDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/CbsMemberAlertDialog.java new file mode 100644 index 0000000..d321ced --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/CbsMemberAlertDialog.java @@ -0,0 +1,32 @@ +package com.rehome.meetingbook.weiget; + +import android.content.Context; +import android.view.Display; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-10 11:28 + * 描述: + */ +public class CbsMemberAlertDialog extends AlertDialog { + public CbsMemberAlertDialog(@NonNull Context context) { + super(context); + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) / 4; + } + + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/ChangeBzDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/ChangeBzDialog.java new file mode 100644 index 0000000..e89c2cc --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/ChangeBzDialog.java @@ -0,0 +1,102 @@ +package com.rehome.meetingbook.weiget; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; + +import com.rehome.meetingbook.bean.AppointmentMemberBean; +import com.rehome.meetingbook.databinding.DialogChangeBzBinding; +import com.rehome.meetingbook.databinding.DialogResultBinding; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-19 09:19 + * 描述: + */ +public class ChangeBzDialog extends Dialog { + protected View mView; + protected DialogChangeBzBinding binding; + Context context; + private ChangeBzDialogListener listener; + private AppointmentMemberBean.RowsBean item; + + public ChangeBzDialog(@NonNull Context context, String msg, AppointmentMemberBean.RowsBean item, ChangeBzDialogListener listener) { + super(context); + this.context=context; + this.item=item; + binding = DialogChangeBzBinding.inflate(getLayoutInflater()); + mView = binding.getRoot(); + binding.tvTitle.setText(msg); + binding.etIstz.setText(item.getIstzzy()); + binding.etBeizhu.setText(item.getBz()); + + binding.bottomBtnView.dialogCommit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (listener != null) { + item.setIstzzy(binding.etIstz.getText().toString().trim()); + item.setBz(binding.etBeizhu.getText().toString().trim()); + listener.confirm(); + } + } + }); + binding.bottomBtnView.dialogCancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (listener != null) { + listener.cancel(); + } + } + }); + + this.listener = listener; + setCancelable(false); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(mView); + + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) / 2; + window.setGravity(Gravity.CENTER); + +// Window window = this.getWindow(); +// WindowManager.LayoutParams lp = window.getAttributes(); +// Display d = window.getWindowManager().getDefaultDisplay(); +// lp.width = (int) (d.getWidth() * 0.9F); +// window.setAttributes(lp); + } + + public void setTvMsg(String msg) { + if (!TextUtils.isEmpty(msg)) { + binding.tvTitle.setText(msg); + } + } + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } + + public interface ChangeBzDialogListener { + void confirm(); + void cancel(); + } + +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/ClearEditText.java b/app/src/main/java/com/rehome/meetingbook/weiget/ClearEditText.java new file mode 100644 index 0000000..b259029 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/ClearEditText.java @@ -0,0 +1,128 @@ +package com.rehome.meetingbook.weiget; + + +import android.content.Context; +import android.graphics.drawable.Drawable; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.appcompat.widget.AppCompatEditText; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.rehome.meetingbook.R; + + +/** + * Create By HuangWenFei + * 创建日期:2022-12-08 14:01 + * 描述:一个可以清空文本框的EditText + */ + +public class ClearEditText extends AppCompatEditText implements View.OnTouchListener, View.OnFocusChangeListener, TextWatcher { + + private Drawable mClearTextIcon; + private OnFocusChangeListener mOnFocusChangeListener; + private OnTouchListener mOnTouchListener; + + public ClearEditText(final Context context) { + super(context); + init(context); + } + + public ClearEditText(final Context context, final AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public ClearEditText(final Context context, final AttributeSet attrs, final int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context); + } + + private void init(final Context context) { + + final Drawable drawable = ContextCompat.getDrawable(context, R.drawable.del); + final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); //Wrap the drawable so that it can be tinted pre Lollipop + DrawableCompat.setTint(wrappedDrawable, getCurrentHintTextColor()); + mClearTextIcon = wrappedDrawable; + +// mClearTextIcon= context.getResources().getDrawable(R.drawable.icon_delete_32); + //设置图片在右边 + mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight()/2, mClearTextIcon.getIntrinsicHeight()/2); + //默认设置为隐藏状态1 + setClearIconVisible(false); + super.setOnTouchListener(this); + super.setOnFocusChangeListener(this); + addTextChangedListener(this); + } + + @Override + public void setOnFocusChangeListener(OnFocusChangeListener l) { + mOnFocusChangeListener = l; + } + + @Override + public void setOnTouchListener(OnTouchListener l) { + mOnTouchListener = l; + } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + //如果获取焦点。文本大于0就显示删除按钮, + if (hasFocus) { + setClearIconVisible(getText().length() > 0); + } else { + setClearIconVisible(false); + } + if (mOnFocusChangeListener != null) { + mOnFocusChangeListener.onFocusChange(v, hasFocus); + } + } + + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + final int x = (int) motionEvent.getX(); + //点击删除按钮,就清空字符串 + if (mClearTextIcon.isVisible() && x > getWidth() - getPaddingRight() - mClearTextIcon.getIntrinsicWidth()) { + if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + setError(null); + setText(""); + } + return true; + } + return mOnTouchListener != null && mOnTouchListener.onTouch(view, motionEvent); + } + + @Override + public final void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { + //有获取到焦点且文本发生变化时候,显示删除按钮 + if (isFocused()) { + setClearIconVisible(text.length() > 0); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void afterTextChanged(Editable s) { + + } + + //设置删除图标是否隐藏 + private void setClearIconVisible(final boolean visible) { + mClearTextIcon.setVisible(visible, false); + final Drawable[] compoundDrawables = getCompoundDrawables(); + setCompoundDrawables( + compoundDrawables[0], + compoundDrawables[1], + visible ? mClearTextIcon : null, + compoundDrawables[3]); + } + +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/CustomLoadingDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/CustomLoadingDialog.java new file mode 100644 index 0000000..495eecd --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/CustomLoadingDialog.java @@ -0,0 +1,54 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2023-02-20 15:28 + * 描述: + */ +import android.app.Dialog; +import android.content.Context; +import android.view.Gravity; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ImageView; +import android.widget.TextView; + +import com.rehome.meetingbook.R; + +public class CustomLoadingDialog extends Dialog { + + TextView tvLoadingTx; + ImageView ivLoading; + + public CustomLoadingDialog(Context context) { + this(context, R.style.loading_dialog, "请刷身份证..."); + + } + + public CustomLoadingDialog(Context context, String string) { + this(context, R.style.loading_dialog, string); + } + + protected CustomLoadingDialog(Context context, int theme, String string) { + super(context, theme); + setCanceledOnTouchOutside(true);//点击其他区域时 true 关闭弹窗 false 不关闭弹窗 + setContentView(R.layout.loading_dialog);//加载布局 + tvLoadingTx = findViewById(R.id.tv_loading_tx); + tvLoadingTx.setText(string); + ivLoading = findViewById(R.id.iv_loading); + // 加载动画 + Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation( + context, R.anim.loading_animation); + // 使用ImageView显示动画 + ivLoading.startAnimation(hyperspaceJumpAnimation); + + getWindow().getAttributes().gravity = Gravity.CENTER;//居中显示 + getWindow().getAttributes().dimAmount = 0.5f;//背景透明度 取值范围 0 ~ 1 + } + + //关闭弹窗 + @Override + public void dismiss() { + super.dismiss(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/CustomMonthView.java b/app/src/main/java/com/rehome/meetingbook/weiget/CustomMonthView.java new file mode 100644 index 0000000..a048820 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/CustomMonthView.java @@ -0,0 +1,205 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-22 14:19 + * 描述: + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.text.TextUtils; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MonthView; + +/** + * 演示一个变态需求的月视图 + * Created by huanghaibin on 2018/2/9. + */ + +public class CustomMonthView extends MonthView { + + private int mRadius; + + /** + * 自定义魅族标记的文本画笔 + */ + private Paint mTextPaint = new Paint(); + + + /** + * 24节气画笔 + */ + private Paint mSolarTermTextPaint = new Paint(); + + /** + * 背景圆点 + */ + private Paint mPointPaint = new Paint(); + + /** + * 今天的背景色 + */ + private Paint mCurrentDayPaint = new Paint(); + + /** + * 圆点半径 + */ + private float mPointRadius; + + private int mPadding; + + private float mCircleRadius; + /** + * 自定义魅族标记的圆形背景 + */ + private Paint mSchemeBasicPaint = new Paint(); + + private float mSchemeBaseLine; + + public CustomMonthView(Context context) { + super(context); + + mTextPaint.setTextSize(dipToPx(context, 8)); + mTextPaint.setColor(0xffffffff); + mTextPaint.setAntiAlias(true); + mTextPaint.setFakeBoldText(true); + + + mSolarTermTextPaint.setColor(0xff489dff); + mSolarTermTextPaint.setAntiAlias(true); + mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER); + + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setFakeBoldText(true); + mSchemeBasicPaint.setColor(Color.WHITE); + + + mCurrentDayPaint.setAntiAlias(true); + mCurrentDayPaint.setStyle(Paint.Style.FILL); + mCurrentDayPaint.setColor(0xFFeaeaea); + + mPointPaint.setAntiAlias(true); + mPointPaint.setStyle(Paint.Style.FILL); + mPointPaint.setTextAlign(Paint.Align.CENTER); + mPointPaint.setColor(Color.RED); + + mCircleRadius = dipToPx(getContext(), 7); + + mPadding = dipToPx(getContext(), 3); + + mPointRadius = dipToPx(context, 2); + + Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics(); + mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1); + } + + + @Override + protected void onPreviewHook() { + mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize()); + mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5; + mSchemePaint.setStyle(Paint.Style.STROKE); + } + + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + return true; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSchemePaint); + +// boolean isSelected = isSelected(calendar); +// if (isSelected) { +// mPointPaint.setColor(Color.WHITE); +// } else { +// mPointPaint.setColor(Color.GRAY); +// } +// +// canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint); + } + + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + int top = y - mItemHeight / 6; + + if (calendar.isCurrentDay() && !isSelected) { + canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); + } + +// if (hasScheme) { +// canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, y + mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint); +// mTextPaint.setColor(calendar.getSchemeColor()); +// canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, y + mPadding + mSchemeBaseLine, mTextPaint); +// } + + //当然可以换成其它对应的画笔就不麻烦, + if (calendar.isWeekend() && calendar.isCurrentMonth()) { + mCurMonthTextPaint.setColor(0xFF489dff); + mCurMonthLunarTextPaint.setColor(0xFF489dff); + mSchemeTextPaint.setColor(0xFF489dff); + mSchemeLunarTextPaint.setColor(0xFF489dff); + mOtherMonthLunarTextPaint.setColor(0xFF489dff); + mOtherMonthTextPaint.setColor(0xFF489dff); + } else { + mCurMonthTextPaint.setColor(0xff333333); + mCurMonthLunarTextPaint.setColor(0xffCFCFCF); + mSchemeTextPaint.setColor(0xff333333); + mSchemeLunarTextPaint.setColor(0xffCFCFCF); + + mOtherMonthTextPaint.setColor(0xFFe1e1e1); + mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1); + } + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + mSelectTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint); + } else if (hasScheme) { + + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, + !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint); + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, + calendar.isCurrentDay() ? mCurDayLunarTextPaint : + calendar.isCurrentMonth() ? !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : + mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/CustomWeekView.java b/app/src/main/java/com/rehome/meetingbook/weiget/CustomWeekView.java new file mode 100644 index 0000000..2f89db4 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/CustomWeekView.java @@ -0,0 +1,206 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-22 14:16 + * 描述: + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.text.TextUtils; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.WeekView; + +/** + * 演示一个变态需求的周视图 + * Created by huanghaibin on 2018/2/9. + */ + +public class CustomWeekView extends WeekView { + + + private int mRadius; + + /** + * 自定义魅族标记的文本画笔 + */ + private Paint mTextPaint = new Paint(); + + + /** + * 24节气画笔 + */ + private Paint mSolarTermTextPaint = new Paint(); + + /** + * 背景圆点 + */ + private Paint mPointPaint = new Paint(); + + /** + * 今天的背景色 + */ + private Paint mCurrentDayPaint = new Paint(); + + + /** + * 圆点半径 + */ + private float mPointRadius; + + private int mPadding; + + private float mCircleRadius; + /** + * 自定义魅族标记的圆形背景 + */ + private Paint mSchemeBasicPaint = new Paint(); + + private float mSchemeBaseLine; + + public CustomWeekView(Context context) { + super(context); + mTextPaint.setTextSize(dipToPx(context, 8)); + mTextPaint.setColor(0xffffffff); + mTextPaint.setAntiAlias(true); + mTextPaint.setFakeBoldText(true); + + + mSolarTermTextPaint.setColor(0xff489dff); + mSolarTermTextPaint.setAntiAlias(true); + mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER); + + mSchemeBasicPaint.setAntiAlias(true); + mSchemeBasicPaint.setStyle(Paint.Style.FILL); + mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); + mSchemeBasicPaint.setFakeBoldText(true); + mSchemeBasicPaint.setColor(Color.WHITE); + + mPointPaint.setAntiAlias(true); + mPointPaint.setStyle(Paint.Style.FILL); + mPointPaint.setTextAlign(Paint.Align.CENTER); + mPointPaint.setColor(Color.RED); + + + mCurrentDayPaint.setAntiAlias(true); + mCurrentDayPaint.setStyle(Paint.Style.FILL); + mCurrentDayPaint.setColor(0xFFeaeaea); + + + mCircleRadius = dipToPx(getContext(), 7); + + mPadding = dipToPx(getContext(), 3); + + mPointRadius = dipToPx(context, 2); + + Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics(); + mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1); + + } + + + @Override + protected void onPreviewHook() { + mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize()); + mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5; + } + + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + return true; + } + + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + + boolean isSelected = isSelected(calendar); + if (isSelected) { + mPointPaint.setColor(Color.WHITE); + } else { + mPointPaint.setColor(Color.GRAY); + } + + canvas.drawCircle(x + mItemWidth / 2, mItemHeight - 3 * mPadding, mPointRadius, mPointPaint); + } + + @SuppressWarnings("IntegerDivisionInFloatingPointContext") + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + int cx = x + mItemWidth / 2; + int cy = mItemHeight / 2; + int top = -mItemHeight / 6; + + if (calendar.isCurrentDay() && !isSelected) { + canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); + } + + if(hasScheme){ + canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint); + + mTextPaint.setColor(calendar.getSchemeColor()); + + canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, mPadding + mSchemeBaseLine, mTextPaint); + } + + if (calendar.isWeekend() && calendar.isCurrentMonth()) { + mCurMonthTextPaint.setColor(0xFF489dff); + mCurMonthLunarTextPaint.setColor(0xFF489dff); + mSchemeTextPaint.setColor(0xFF489dff); + mSchemeLunarTextPaint.setColor(0xFF489dff); + mOtherMonthLunarTextPaint.setColor(0xFF489dff); + mOtherMonthTextPaint.setColor(0xFF489dff); + } else { + mCurMonthTextPaint.setColor(0xff333333); + mCurMonthLunarTextPaint.setColor(0xffCFCFCF); + mSchemeTextPaint.setColor(0xff333333); + mSchemeLunarTextPaint.setColor(0xffCFCFCF); + + mOtherMonthTextPaint.setColor(0xFFe1e1e1); + mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1); + } + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + mSelectTextPaint); + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, mSelectedLunarTextPaint); + } else if (hasScheme) { + + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, + !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint); + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); + + canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + mItemHeight / 10, + calendar.isCurrentDay() ? mCurDayLunarTextPaint : + !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : + calendar.isCurrentMonth() ? + mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/CustomYearView.java b/app/src/main/java/com/rehome/meetingbook/weiget/CustomYearView.java new file mode 100644 index 0000000..0284cca --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/CustomYearView.java @@ -0,0 +1,133 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-22 14:18 + * 描述: + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.YearView; + +/** + * 自定义年视图 + * Created by huanghaibin on 2018/10/9. + */ +@SuppressWarnings("unused") +public class CustomYearView extends YearView { + + private int mTextPadding; + /** + * 闰年字体 + */ + private Paint mLeapYearTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + public CustomYearView(Context context) { + super(context); + mTextPadding = dipToPx(context, 3); + + mLeapYearTextPaint.setTextSize(dipToPx(context, 12)); + mLeapYearTextPaint.setColor(0xffd1d1d1); + mLeapYearTextPaint.setAntiAlias(true); + mLeapYearTextPaint.setFakeBoldText(true); + + } + + @Override + protected void onDrawMonth(Canvas canvas, int year, int month, int x, int y, int width, int height) { + + String text = getContext() + .getResources() + .getStringArray(com.haibin.calendarview.R.array.month_string_array)[month - 1]; + canvas.drawText(text, + x + mItemWidth / 2 - mTextPadding, + y + mMonthTextBaseLine, + mMonthTextPaint); + if (month == 2 && isLeapYear(year)) { + float w = getTextWidth(mMonthTextPaint, text); + + canvas.drawText("闰年", + x + mItemWidth / 2 - mTextPadding + w + dipToPx(getContext(), 6), + y + mMonthTextBaseLine, + mLeapYearTextPaint); + } + } + + private float getTextWidth(Paint paint, String text) { + return paint.measureText(text); + } + + /** + * 是否是闰年 + * + * @param year year + * @return 是否是闰年 + */ + private static boolean isLeapYear(int year) { + return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); + } + + + + @Override + protected void onDrawWeek(Canvas canvas, int week, int x, int y, int width, int height) { + String text = getContext().getResources().getStringArray(com.haibin.calendarview.R.array.year_view_week_string_array)[week]; + canvas.drawText(text, + x + width / 2, + y + mWeekTextBaseLine, + mWeekTextPaint); + } + + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + int radius = Math.min(mItemWidth, mItemHeight) / 8 * 5; + canvas.drawCircle(cx, cy, radius, mSelectedPaint); + return true; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + float baselineY = mTextBaseLine + y; + int cx = x + mItemWidth / 2; + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + hasScheme ? mSchemeTextPaint : mSelectTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : mSchemeTextPaint); + + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : mCurMonthTextPaint); + } + } + + /** + * dp转px + * + * @param context context + * @param dpValue dp + * @return px + */ + private static int dipToPx(Context context, float dpValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (dpValue * scale + 0.5f); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/DateTimeMinutePickDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/DateTimeMinutePickDialog.java new file mode 100644 index 0000000..6bd4f33 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/DateTimeMinutePickDialog.java @@ -0,0 +1,279 @@ +package com.rehome.meetingbook.weiget; + +import android.app.Dialog; +import android.content.Context; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.DatePicker; +import android.widget.TextView; +import android.widget.TimePicker; + + +import com.rehome.meetingbook.R; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + + +/** + * Create By HuangWenFei + * 创建日期:2022-12-09 15:51 + * 描述:时间日期选择器 + */ +public class DateTimeMinutePickDialog extends Dialog implements View.OnClickListener, DatePicker.OnDateChangedListener, + TimePicker.OnTimeChangedListener { + + private final TextView tv_dialog_title; + private TextView tv_dialog_msg; + private final TextView tv_dialog_commit; + private final TextView tv_dialog_cancel; + private final View lay_dialog_title; + private final View lay_dialog_cancel; + private View lay_dialog_commit; + private final DateTimeMinutePickDialog.CommitClickListener commitClickListener; + private final DatePicker datePicker; + private final TimePicker timePicker; + private String dateTime, outPutDateTime, outPutDateTime1, outPutDateTime2; + private Calendar calendar = Calendar.getInstance(); + private final Calendar nowCalendar = Calendar.getInstance();//现在时间 + private Calendar tempCalendar = Calendar.getInstance();//历史时间 + + + private final SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); + private final SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + private final SimpleDateFormat simpleDateFormat3 = new SimpleDateFormat("yyyy-MM-dd"); + private final SimpleDateFormat simpleDateFormat4 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public DateTimeMinutePickDialog(Context context, DateTimeMinutePickDialog.CommitClickListener commitClickListener) { + super(context); + this.commitClickListener = commitClickListener; + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setBackgroundDrawableResource(android.R.color.transparent); + setContentView(R.layout.layout_datetime_dialog); + + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) * 2 / 5; + window.setGravity(Gravity.CENTER); + + lay_dialog_title = findViewById(R.id.lay_dialog_title); + tv_dialog_title = findViewById(R.id.dialog_title); + + lay_dialog_cancel = findViewById(R.id.lay_dialog_cancel); +// lay_dialog_commit = findViewById(R.id.lay_dialog_commit); + + tv_dialog_cancel = findViewById(R.id.dialog_cancel); + tv_dialog_commit = findViewById(R.id.dialog_commit); + + datePicker = findViewById(R.id.datePicker); + timePicker = findViewById(R.id.timePicker); + + if (calendar != null) { + initDateTime(datePicker, timePicker, calendar); + } + + timePicker.setIs24HourView(true); + timePicker.setOnTimeChangedListener(this); + tv_dialog_cancel.setOnClickListener(this); + tv_dialog_commit.setOnClickListener(this); + } + + public DateTimeMinutePickDialog(Context context, Calendar calendar,boolean isStartTime,DateTimeMinutePickDialog.CommitClickListener commitClickListener) { + super(context); + this.commitClickListener = commitClickListener; + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setBackgroundDrawableResource(android.R.color.transparent); + setContentView(R.layout.layout_datetime_dialog); + + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) * 2 / 5; + window.setGravity(Gravity.CENTER); + + lay_dialog_title = findViewById(R.id.lay_dialog_title); + tv_dialog_title = findViewById(R.id.dialog_title); + + lay_dialog_cancel = findViewById(R.id.lay_dialog_cancel); +// lay_dialog_commit = findViewById(R.id.lay_dialog_commit); + + tv_dialog_cancel = findViewById(R.id.dialog_cancel); + tv_dialog_commit = findViewById(R.id.dialog_commit); + + datePicker = findViewById(R.id.datePicker); + timePicker = findViewById(R.id.timePicker); + + this.calendar=calendar; + if (calendar != null) { + if(isStartTime){ + initDateTime(datePicker, timePicker, calendar,true); + }else{ + initDateTime(datePicker, timePicker, calendar,false); + } + } + + timePicker.setIs24HourView(true); + timePicker.setOnTimeChangedListener(this); + tv_dialog_cancel.setOnClickListener(this); + tv_dialog_commit.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.dialog_cancel: + dismiss(); + break; + case R.id.dialog_commit: + commitClickListener.confirm(outPutDateTime, outPutDateTime1,outPutDateTime2,calendar); + dismiss(); + break; + } + } + + public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { + onDateChanged(null, 0, 0, 0); + } + + /** + * 时间改变时候回调 + * + * @param view + * @param year 年 + * @param monthOfYear 月 + * @param dayOfMonth 日 + */ + public void onDateChanged(DatePicker view, int year, int monthOfYear, + int dayOfMonth) { + tempCalendar.set(datePicker.getYear(), datePicker.getMonth(), + datePicker.getDayOfMonth(), timePicker.getCurrentHour(), + timePicker.getCurrentMinute(),0); + + /** + * 如果当前时间大于选择的时间,就重置时间 + */ +// if (nowCalendar.getTimeInMillis() > tempCalendar.getTimeInMillis()) { +// changeDateTime(datePicker, timePicker, nowCalendar); +// } else { + calendar = tempCalendar; + dateTime = simpleDateFormat1.format(calendar.getTime()); + tv_dialog_title.setText(dateTime); + outPutDateTime = simpleDateFormat2.format(calendar.getTime()); + outPutDateTime1 = simpleDateFormat3.format(calendar.getTime()); + outPutDateTime2 = simpleDateFormat4.format(calendar.getTime()); +// } + } + + /** + * 改变时间 + * + * @param datePicker 日期选择控件 + * @param timePicker 时间选择控件 + * @param calendar 日历类 + */ + private void changeDateTime(DatePicker datePicker, TimePicker timePicker, Calendar calendar) { + datePicker.init(calendar.get(Calendar.YEAR), + calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH), this); + //设置不显示年 + if (datePicker != null) { + ((ViewGroup) ((ViewGroup) datePicker.getChildAt(0)).getChildAt(0)).getChildAt(0).setVisibility(View.GONE); + } + tv_dialog_title.setText(simpleDateFormat1.format(calendar.getTime())); + + //设置显示时分 + timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); + timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE)); + } + + /** + * 初始化时间 + * + * @param datePicker 日期选择控件 + * @param timePicker 时间选择控件 + * @param calendar 日历类 + */ + private void initDateTime(DatePicker datePicker, TimePicker timePicker, Calendar calendar) { +// calendar.add(Calendar.DATE, 1); + datePicker.init(calendar.get(Calendar.YEAR), + calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH), this); +// 设置不显示年 + if (datePicker != null) { + ((ViewGroup) ((ViewGroup) datePicker.getChildAt(0)).getChildAt(0)).getChildAt(0).setVisibility(View.GONE); + } + + calendar.set(datePicker.getYear(), datePicker.getMonth(), + datePicker.getDayOfMonth(), timePicker.getCurrentHour(), + timePicker.getCurrentMinute(),0); + + + tv_dialog_title.setText(simpleDateFormat1.format(calendar.getTime())); + //设置显示时分 + timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); + timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE)); + tempCalendar = calendar; + outPutDateTime = simpleDateFormat2.format(calendar.getTime()); + outPutDateTime1 = simpleDateFormat3.format(calendar.getTime()); + outPutDateTime2 = simpleDateFormat4.format(calendar.getTime()); + } + + /** + * 初始化时间 + * + * @param datePicker 日期选择控件 + * @param timePicker 时间选择控件 + * @param calendar 日历类 + */ + private void initDateTime(DatePicker datePicker, TimePicker timePicker, Calendar calendar,boolean isStartTime) { +// calendar.add(Calendar.DATE, 1); + datePicker.init(calendar.get(Calendar.YEAR), + calendar.get(Calendar.MONTH), + calendar.get(Calendar.DAY_OF_MONTH), this); +// 设置不显示年 + if (datePicker != null) { + ((ViewGroup) ((ViewGroup) datePicker.getChildAt(0)).getChildAt(0)).getChildAt(0).setVisibility(View.GONE); + } + + if(isStartTime){ + calendar.set(datePicker.getYear(), datePicker.getMonth(), + datePicker.getDayOfMonth(), 9, + 0,0); + }else{ + calendar.set(datePicker.getYear(), datePicker.getMonth(), + datePicker.getDayOfMonth(), 16, + 0,0); + } + + + tv_dialog_title.setText(simpleDateFormat1.format(calendar.getTime())); + //设置显示时分 + timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY)); + timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE)); + tempCalendar = calendar; + outPutDateTime = simpleDateFormat2.format(calendar.getTime()); + outPutDateTime1 = simpleDateFormat3.format(calendar.getTime()); + outPutDateTime2 = simpleDateFormat4.format(calendar.getTime()); + } + + public interface CommitClickListener { + /** + * @param outPutDate 精确到分 + * @param outPutDate1 精确到天 + * @param outPutDate2 精确到秒 + */ + void confirm(String outPutDate, String outPutDate1, String outPutDate2,Calendar calendarCallBack); + } + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/InputLayout.java b/app/src/main/java/com/rehome/meetingbook/weiget/InputLayout.java new file mode 100644 index 0000000..dccca6f --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/InputLayout.java @@ -0,0 +1,248 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-09 15:10 + * 描述: + */ + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; + +import android.graphics.Color; +import android.text.Html; +import android.text.InputType; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.View; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.rehome.meetingbook.R; +import com.zhy.autolayout.AutoLinearLayout; +import com.zhy.autolayout.utils.AutoUtils; + + +/** + * Created by Rehome-rjb1 on 2017/5/9. + *

+ * 输入框 + * + * + * + * + * + * + * + * + * + */ + +public class InputLayout extends AutoLinearLayout { + + TextView tvTitle; + ClearEditText etContent; + TextView tvContent; + NumAddSubView numAddSubView; + ImageButton ibtnSelect; + + private View view; + + public InputLayout(Context context) { + super(context, null); + initView(); + } + + public InputLayout(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(); + if (attrs != null) { + TypedArray type = context.obtainStyledAttributes(attrs, R.styleable.InputLayout); + + String title = type.getString(R.styleable.InputLayout_tv_title); + Boolean isShowSelect = type.getBoolean(R.styleable.InputLayout_isShowSelect, false); + Boolean isShowTextView = type.getBoolean(R.styleable.InputLayout_isShowTextView, false); + Boolean isShowNumSubView = type.getBoolean(R.styleable.InputLayout_isShowNumSubView, false); + String hintText = type.getString(R.styleable.InputLayout_hintText); + Boolean must = type.getBoolean(R.styleable.InputLayout_must, false); + + int minValue = type.getInt(R.styleable.InputLayout_minValue, 1); + numAddSubView.setMinNum(minValue); + + setHintText(hintText); + setTvTitle(title, must); + isShowIbtnSelect(isShowSelect); + isShowTextView(isShowTextView); + isShowNumSubView(isShowNumSubView); + type.recycle(); + } + } + + + public InputLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + public void setTitleColor(){ + tvTitle.setTextColor(Color.parseColor("#737373")); + } + + private void initView() { + + if (view == null) { + view = View.inflate(getContext(), R.layout.layout_input, this); + AutoUtils.auto(view); + + tvTitle = view.findViewById(R.id.tv_title); + etContent = view.findViewById(R.id.et_content); + tvContent = view.findViewById(R.id.tv_content); + numAddSubView = view.findViewById(R.id.numAddSubView); + ibtnSelect = view.findViewById(R.id.ibtn_select); + } + + etContent.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + + if (event != null) { + return (event.getKeyCode() == KeyEvent.KEYCODE_ENTER); + } else { + return false; + } + } + }); + + } + + public void setTvTitle(String title, boolean must) { + + if (must) { + String mustTitle = title + "*"; + tvTitle.setText(Html.fromHtml(mustTitle + ":")); + } else { + tvTitle.setText(title + ":"); + } + } + + public void isShowIbtnSelect(boolean isShow) { + ibtnSelect.setVisibility(isShow ? VISIBLE : GONE); + } + + public void isShowTextView(boolean isShow) { + + if (isShow) { + tvContent.setVisibility(VISIBLE); + etContent.setVisibility(GONE); + } + } + + public void isShowNumSubView(boolean isShow) { + numAddSubView.setVisibility(isShow ? VISIBLE : GONE); + } + + /** + * 设置选择控件的点击事件 + * + * @param listener + */ + public void setIbtnSelectOnClickListener(OnClickListener listener) { + ibtnSelect.setOnClickListener(listener); + } + + /** + * 设置文本框点击事件 + * + * @param listener + */ + public void setTvContentOnClickListener(OnClickListener listener) { + tvContent.setOnClickListener(listener); + } + + + /** + * 设置文本内容 + * + * @param content + */ + public void setContent(String content) { + + if (tvContent.getVisibility() == VISIBLE) { + tvContent.setText(content); + } else { + etContent.setText(content); + } + } + + public void setHintText(String hintText) { + tvContent.setHint(hintText); + } + + /** + * 获取文本内容 + * + * @return + */ + public String getContent() { + String content; + if (tvContent.getVisibility() == VISIBLE) { + content = tvContent.getText().toString(); + } else { + content = etContent.getText().toString(); + } + return content; + } + + /** + * 设置为+号的按钮 + */ + public void setIbtnSelectIcon() { + ibtnSelect.setImageResource(R.drawable.add_gray); + } + + /** + * 获取加减控件的值 + * + * @return + */ + public String getNum() { + return numAddSubView.getNum(); + } + + public void setNum(String num) { + numAddSubView.setNum(num); + } + + /** + * 设置不可编辑 + * + * @param enabled + */ + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + +// etContent.setVisibility(VISIBLE); +// tvContent.setVisibility(VISIBLE); + + etContent.setEnabled(enabled); + tvContent.setEnabled(enabled); + ibtnSelect.setEnabled(enabled); + numAddSubView.setEnabled(enabled); + } + + /** + * 设置为数字类型的InputType + */ + public void setEtNumInputType() { + etContent.setInputType(InputType.TYPE_CLASS_NUMBER); + } + + /** + * 设置为数字类型的InputType 可加小数点 + */ + public void setNo() { + etContent.setInputType(InputType.TYPE_CLASS_PHONE); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/LoadDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/LoadDialog.java new file mode 100644 index 0000000..64b85b6 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/LoadDialog.java @@ -0,0 +1,128 @@ +package com.rehome.meetingbook.weiget; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.text.TextUtils; +import android.view.Display; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; +import android.widget.Toast; + +import com.rehome.meetingbook.R; + + +/** + * Created by Rehome-rjb1 on 2017/5/17. + * 加载框1 + */ + +public class LoadDialog extends Dialog { + + + private static LoadDialog loadDialog; + + private final boolean cancelable; + + private final String tipMsg; + + + public LoadDialog(final Context ctx, boolean cancelable, String tipMsg) { + super(ctx); + + this.cancelable = cancelable; + this.tipMsg = tipMsg; + + this.getContext().setTheme(android.R.style.Theme_DeviceDefault_Dialog_NoActionBar_MinWidth); + setContentView(R.layout.layout_dialog); + // 必须放在加载布局后 + setparams(); + TextView tv = findViewById(R.id.tvLoad); + if (!TextUtils.isEmpty(tipMsg)) { + tv.setVisibility(View.VISIBLE); + tv.setText(tipMsg); + } + } + + private void setparams() { + this.setCancelable(cancelable); + this.setCanceledOnTouchOutside(false); + WindowManager windowManager = getWindow().getWindowManager(); + Display display = windowManager.getDefaultDisplay(); + WindowManager.LayoutParams lp = this.getWindow().getAttributes(); + // Dialog宽度 + lp.width = (int) (display.getWidth() * 0.7); + Window window = getWindow(); + window.setAttributes(lp); + window.getDecorView().getBackground().setAlpha(0); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (!cancelable) { + Toast.makeText(getContext(), tipMsg, Toast.LENGTH_SHORT).show(); + return true; + } + } + return super.onKeyDown(keyCode, event); + } + + + public static void show(Context context) { + show(context, null, true); + } + + + public static void show(Context context, String message) { + show(context, message, true); + } + + + public static void show(Context context, int resourceId) { + show(context, context.getResources().getString(resourceId), true); + } + + + private static void show(Context context, String message, boolean cancelable) { + if (context instanceof Activity) { + if (((Activity) context).isFinishing()) { + return; + } + } + if (loadDialog != null && loadDialog.isShowing()) { + return; + } + loadDialog = new LoadDialog(context, cancelable, message); + loadDialog.show(); + } + + public static void dismiss(Context context) { + try { + if (context instanceof Activity) { + if (((Activity) context).isFinishing()) { + loadDialog = null; + return; + } + } + + if (loadDialog != null && loadDialog.isShowing()) { + Context loadContext = loadDialog.getContext(); + if (loadContext != null && loadContext instanceof Activity) { + if (((Activity) loadContext).isFinishing()) { + loadDialog = null; + return; + } + } + loadDialog.dismiss(); + loadDialog = null; + } + } catch (Exception e) { + e.printStackTrace(); + loadDialog = null; + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/MeiZuMonthView.java b/app/src/main/java/com/rehome/meetingbook/weiget/MeiZuMonthView.java new file mode 100644 index 0000000..36fb4e8 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/MeiZuMonthView.java @@ -0,0 +1,84 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-20 11:43 + * 描述: + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MonthView; + +/** + * 定制高仿魅族日历界面,按你的想象力绘制出各种各样的界面 + * + */ +public class MeiZuMonthView extends MonthView { + private int mRadius; + + public MeiZuMonthView(Context context) { + super(context); + } + + @Override + protected void onPreviewHook() { + mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + //FILL 内部填充 + //STROKE 描边 + //FILL_AND_STROKE 内部填充+描边 + mSchemePaint.setStyle(Paint.Style.FILL_AND_STROKE); + } + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + return true; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSchemePaint); + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + //建立文字原点 + float baselineY = mTextBaseLine + y; + int cx = x + mItemWidth / 2; + //判断当前日期是否在本月中 + boolean isInRange = isInRange(calendar); + //判断当前日期是否可用 + boolean isEnable = !onCalendarIntercept(calendar); + //如果该日期被选中,添加选中样式 + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + mSelectTextPaint); + } + //如果没被选中但是是标注日期 + else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange && isEnable ? mSchemeTextPaint : mOtherMonthTextPaint); + } + //其他 + else { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange && isEnable ? mCurMonthTextPaint : mOtherMonthTextPaint); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/MyMonthView.java b/app/src/main/java/com/rehome/meetingbook/weiget/MyMonthView.java new file mode 100644 index 0000000..c1dc4fd --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/MyMonthView.java @@ -0,0 +1,94 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-20 11:02 + * 描述: + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MultiMonthView; + +public class MyMonthView extends MultiMonthView { + private int mRadius; + + public MyMonthView(Context context) { + super(context); + } + + @Override + protected void onPreviewHook() { + mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + //FILL 内部填充 + //STROKE 描边 + //FILL_AND_STROKE 内部填充+描边 + mSchemePaint.setStyle(Paint.Style.FILL_AND_STROKE); + } + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelectedPre, boolean isSelectedNext) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + + //可点开onDrawSelected自行查看参数说明 + if (isSelectedPre) { + if (isSelectedNext) { + canvas.drawRect(x, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint); + } else {//最后一个,the last + canvas.drawRect(x, cy - mRadius, cx, cy + mRadius, mSelectedPaint); + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + } + } else { + if (isSelectedNext) { + canvas.drawRect(cx, cy - mRadius, x + mItemWidth, cy + mRadius, mSelectedPaint); + } + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + } + return false; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y, boolean isSelected) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSchemePaint); + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + //建立文字原点 + float baselineY = mTextBaseLine + y; + int cx = x + mItemWidth / 2; + //判断当前日期是否在本月中 + boolean isInRange = isInRange(calendar); + //判断当前日期是否可用 + boolean isEnable = !onCalendarIntercept(calendar); + //如果该日期被选中,添加选中样式 + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + mSelectTextPaint); + } + //如果没被选中但是是标注日期 + else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange && isEnable ? mSchemeTextPaint : mOtherMonthTextPaint); + } + //其他 + else { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() && isInRange && isEnable ? mCurMonthTextPaint : mOtherMonthTextPaint); + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/NumAddSubView.java b/app/src/main/java/com/rehome/meetingbook/weiget/NumAddSubView.java new file mode 100644 index 0000000..83b386a --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/NumAddSubView.java @@ -0,0 +1,122 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-09 15:15 + * 描述: + */ + +import android.content.Context; +import android.content.res.TypedArray; +import androidx.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.rehome.meetingbook.R; + +/** + * 可以加减的控件 + */ +public class NumAddSubView extends LinearLayout { + + ImageButton ibtnSub; + TextView tvNum; + ImageButton ibtnAdd; + private View view; + + private int maxNum = 100; + private int minNum = 1; + + public NumAddSubView(Context context) { + super(context, null); + initView(); + } + + public NumAddSubView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(); + + if (attrs != null) { + TypedArray type = context.obtainStyledAttributes(attrs, R.styleable.NumAddSubView); + maxNum = type.getInt(R.styleable.NumAddSubView_maxNum, 100); + minNum = type.getInt(R.styleable.NumAddSubView_minNum, 1); + } + } + + public NumAddSubView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(); + } + + private void initView() { + + if (view == null) { + view = View.inflate(getContext(), R.layout.num_add_sub_layout, this); + ibtnSub = view.findViewById(R.id.ibtn_sub); + tvNum = view.findViewById(R.id.tv_num); + ibtnAdd = view.findViewById(R.id.ibtn_add); + + ibtnAdd.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + int nowMax = getNum(tvNum) + 1; + if (nowMax <= maxNum) { + tvNum.setText(nowMax + ""); + if (listener != null) { + listener.numChange(tvNum.getText().toString()); + } + } + + } + }); + ibtnSub.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + int nowMin = getNum(tvNum) - 1; + if (nowMin >= minNum) { + tvNum.setText(nowMin + ""); + if (listener != null) { + listener.numChange(tvNum.getText().toString()); + } + } + + } + }); + } + + tvNum.setText("1"); + } + + public void setMaxNum(int maxNum) { + this.maxNum = maxNum; + } + + public void setMinNum(int minNum) { + this.minNum = minNum; + } + + public void setNum(String num) { + tvNum.setText(num); + } + + public int getNum(TextView num) { + return Integer.parseInt(num.getText().toString()); + } + + public String getNum() { + return tvNum.getText().toString(); + } + + private NumChangeListener listener; + + public void setListener(NumChangeListener listener) { + this.listener = listener; + } + + public interface NumChangeListener { + void numChange(String num); + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/ResultDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/ResultDialog.java new file mode 100644 index 0000000..acf5862 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/ResultDialog.java @@ -0,0 +1,86 @@ +package com.rehome.meetingbook.weiget; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Display; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +import androidx.annotation.NonNull; + +import com.rehome.meetingbook.R; +import com.rehome.meetingbook.databinding.DialogResultBinding; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-13 11:18 + * 描述: + */ +public class ResultDialog extends Dialog { + protected View mView; + protected DialogResultBinding binding; + Context context; + private ResultDialogListener listener; + + public ResultDialog(@NonNull Context context, String msg, ResultDialogListener listener) { + super(context); + this.context=context; + binding = DialogResultBinding.inflate(getLayoutInflater()); + mView = binding.getRoot(); + binding.tvMsg.setText(msg); + + binding.bottomBtnView.dialogCommit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismiss(); + if (listener != null) { + listener.confirm(); + } + } + }); + + this.listener = listener; + setCancelable(false); + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(mView); + + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) / 4; + window.setGravity(Gravity.CENTER); + +// Window window = this.getWindow(); +// WindowManager.LayoutParams lp = window.getAttributes(); +// Display d = window.getWindowManager().getDefaultDisplay(); +// lp.width = (int) (d.getWidth() * 0.9F); +// window.setAttributes(lp); + } + + public void setTvMsg(String msg) { + if (!TextUtils.isEmpty(msg)) { + binding.tvMsg.setText(msg); + } + } + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } + + public interface ResultDialogListener { + void confirm(); + } + +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/SimpleMonthView.java b/app/src/main/java/com/rehome/meetingbook/weiget/SimpleMonthView.java new file mode 100644 index 0000000..48cd684 --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/SimpleMonthView.java @@ -0,0 +1,74 @@ +package com.rehome.meetingbook.weiget; + + + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.MonthView; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-22 11:34 + * 描述:高仿魅族日历布局 + */ +public class SimpleMonthView extends MonthView { + + private int mRadius; + + public SimpleMonthView(Context context) { + super(context); + } + + @Override + protected void onPreviewHook() { + mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + mSchemePaint.setStyle(Paint.Style.STROKE); + } + + @Override + protected void onLoopStart(int x, int y) { + + } + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + return false; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { + int cx = x + mItemWidth / 2; + int cy = y + mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSchemePaint); + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { + float baselineY = mTextBaseLine + y; + int cx = x + mItemWidth / 2; + + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + mSelectTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); + + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/SimpleWeekView.java b/app/src/main/java/com/rehome/meetingbook/weiget/SimpleWeekView.java new file mode 100644 index 0000000..95cecae --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/SimpleWeekView.java @@ -0,0 +1,67 @@ +package com.rehome.meetingbook.weiget; + +/** + * Create By HuangWenFei + * 创建日期:2022-12-22 11:32 + * 描述:简单周视图 + */ + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; + +import com.haibin.calendarview.Calendar; +import com.haibin.calendarview.WeekView; + +public class SimpleWeekView extends WeekView { + private int mRadius; + + + public SimpleWeekView(Context context) { + super(context); + } + + @Override + protected void onPreviewHook() { + mRadius = Math.min(mItemWidth, mItemHeight) / 5 * 2; + mSchemePaint.setStyle(Paint.Style.STROKE); + } + + @Override + protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { + int cx = x + mItemWidth / 2; + int cy = mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); + return false; + } + + @Override + protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { + int cx = x + mItemWidth / 2; + int cy = mItemHeight / 2; + canvas.drawCircle(cx, cy, mRadius, mSchemePaint); + } + + @Override + protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { + float baselineY = mTextBaseLine; + int cx = x + mItemWidth / 2; + if (isSelected) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + mSelectTextPaint); + } else if (hasScheme) { + canvas.drawText(String.valueOf(calendar.getDay()), + cx, + baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mSchemeTextPaint : mSchemeTextPaint); + + } else { + canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, + calendar.isCurrentDay() ? mCurDayTextPaint : + calendar.isCurrentMonth() ? mCurMonthTextPaint : mCurMonthTextPaint); + } + } +} diff --git a/app/src/main/java/com/rehome/meetingbook/weiget/WaitDialog.java b/app/src/main/java/com/rehome/meetingbook/weiget/WaitDialog.java new file mode 100644 index 0000000..cf013fb --- /dev/null +++ b/app/src/main/java/com/rehome/meetingbook/weiget/WaitDialog.java @@ -0,0 +1,46 @@ +package com.rehome.meetingbook.weiget; + + +import android.app.ProgressDialog; +import android.content.Context; +import android.view.Display; +import android.view.Gravity; +import android.view.Window; +import android.view.WindowManager; + +/** + * Create By HuangWenFei + * 创建日期:2022-11-29 15:28 + * 描述:加载框 + */ +public class WaitDialog extends ProgressDialog { + + public WaitDialog(Context context, String msg) { + super(context); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setCanceledOnTouchOutside(false); + setProgressStyle(STYLE_SPINNER); + setMessage(msg); + } + + public WaitDialog(Context context, String msg, boolean setWidth) { + super(context); + requestWindowFeature(Window.FEATURE_NO_TITLE); + setCanceledOnTouchOutside(false); + setProgressStyle(STYLE_SPINNER); + Window window = getWindow(); + WindowManager.LayoutParams lp = window.getAttributes(); + lp.width = (getScreenWidth(context)) / 5; + window.setGravity(Gravity.CENTER); + setMessage(msg); + + } + + //获取屏幕宽度 + public static int getScreenWidth(Context context) { + WindowManager manager = (WindowManager) context + .getSystemService(Context.WINDOW_SERVICE); + Display display = manager.getDefaultDisplay(); + return display.getWidth(); + } +} diff --git a/app/src/main/res/anim/loading_animation.xml b/app/src/main/res/anim/loading_animation.xml new file mode 100644 index 0000000..c66f376 --- /dev/null +++ b/app/src/main/res/anim/loading_animation.xml @@ -0,0 +1,13 @@ + + + + \ 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 new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ac_back_icon.png b/app/src/main/res/drawable/ac_back_icon.png new file mode 100644 index 0000000..4ddaa35 Binary files /dev/null and b/app/src/main/res/drawable/ac_back_icon.png differ diff --git a/app/src/main/res/drawable/add.png b/app/src/main/res/drawable/add.png new file mode 100644 index 0000000..4d27ea9 Binary files /dev/null and b/app/src/main/res/drawable/add.png differ diff --git a/app/src/main/res/drawable/add_gray.png b/app/src/main/res/drawable/add_gray.png new file mode 100644 index 0000000..45e85c1 Binary files /dev/null and b/app/src/main/res/drawable/add_gray.png differ diff --git a/app/src/main/res/drawable/bg_edittext.xml b/app/src/main/res/drawable/bg_edittext.xml new file mode 100644 index 0000000..c24c1ed --- /dev/null +++ b/app/src/main/res/drawable/bg_edittext.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_ripple.xml b/app/src/main/res/drawable/bg_ripple.xml new file mode 100644 index 0000000..20fd151 --- /dev/null +++ b/app/src/main/res/drawable/bg_ripple.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/btn_normal.xml b/app/src/main/res/drawable/btn_normal.xml new file mode 100644 index 0000000..e82cc61 --- /dev/null +++ b/app/src/main/res/drawable/btn_normal.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_pressed.xml b/app/src/main/res/drawable/btn_pressed.xml new file mode 100644 index 0000000..d902a8e --- /dev/null +++ b/app/src/main/res/drawable/btn_pressed.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_selector.xml b/app/src/main/res/drawable/btn_selector.xml new file mode 100644 index 0000000..5259843 --- /dev/null +++ b/app/src/main/res/drawable/btn_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/busy.jpg b/app/src/main/res/drawable/busy.jpg new file mode 100644 index 0000000..1a4206b Binary files /dev/null and b/app/src/main/res/drawable/busy.jpg differ diff --git a/app/src/main/res/drawable/countdown_color_next_selector.xml b/app/src/main/res/drawable/countdown_color_next_selector.xml new file mode 100644 index 0000000..daa3382 --- /dev/null +++ b/app/src/main/res/drawable/countdown_color_next_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_color_selector.xml b/app/src/main/res/drawable/countdown_color_selector.xml new file mode 100644 index 0000000..f0f83cd --- /dev/null +++ b/app/src/main/res/drawable/countdown_color_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_next_selector.xml b/app/src/main/res/drawable/countdown_next_selector.xml new file mode 100644 index 0000000..6631a8a --- /dev/null +++ b/app/src/main/res/drawable/countdown_next_selector.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/countdown_selector.xml b/app/src/main/res/drawable/countdown_selector.xml new file mode 100644 index 0000000..9a52ad4 --- /dev/null +++ b/app/src/main/res/drawable/countdown_selector.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/customborder.xml b/app/src/main/res/drawable/customborder.xml new file mode 100644 index 0000000..5f97919 --- /dev/null +++ b/app/src/main/res/drawable/customborder.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/del.png b/app/src/main/res/drawable/del.png new file mode 100644 index 0000000..cb340a2 Binary files /dev/null and b/app/src/main/res/drawable/del.png differ diff --git a/app/src/main/res/drawable/delete_member.png b/app/src/main/res/drawable/delete_member.png new file mode 100644 index 0000000..f5cd45b Binary files /dev/null and b/app/src/main/res/drawable/delete_member.png differ diff --git a/app/src/main/res/drawable/dialog_radius.xml b/app/src/main/res/drawable/dialog_radius.xml new file mode 100755 index 0000000..88f96a5 --- /dev/null +++ b/app/src/main/res/drawable/dialog_radius.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/domo_toolbar_bg.png b/app/src/main/res/drawable/domo_toolbar_bg.png new file mode 100644 index 0000000..715c81c Binary files /dev/null and b/app/src/main/res/drawable/domo_toolbar_bg.png differ diff --git a/app/src/main/res/drawable/edit.png b/app/src/main/res/drawable/edit.png new file mode 100644 index 0000000..87e2b92 Binary files /dev/null and b/app/src/main/res/drawable/edit.png differ diff --git a/app/src/main/res/drawable/filemanagermenubg_w.png b/app/src/main/res/drawable/filemanagermenubg_w.png new file mode 100644 index 0000000..30830d4 Binary files /dev/null and b/app/src/main/res/drawable/filemanagermenubg_w.png differ diff --git a/app/src/main/res/drawable/free.jpg b/app/src/main/res/drawable/free.jpg new file mode 100644 index 0000000..3dc425d Binary files /dev/null and b/app/src/main/res/drawable/free.jpg differ diff --git a/app/src/main/res/drawable/head_photo.png b/app/src/main/res/drawable/head_photo.png new file mode 100644 index 0000000..40f5dff Binary files /dev/null and b/app/src/main/res/drawable/head_photo.png differ diff --git a/app/src/main/res/drawable/home_bg.jpg b/app/src/main/res/drawable/home_bg.jpg new file mode 100644 index 0000000..2a5934f Binary files /dev/null and b/app/src/main/res/drawable/home_bg.jpg differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/icon_phone.png b/app/src/main/res/drawable/icon_phone.png new file mode 100644 index 0000000..75ab1c2 Binary files /dev/null and b/app/src/main/res/drawable/icon_phone.png differ diff --git a/app/src/main/res/drawable/icon_phone1.png b/app/src/main/res/drawable/icon_phone1.png new file mode 100644 index 0000000..ff10d30 Binary files /dev/null and b/app/src/main/res/drawable/icon_phone1.png differ diff --git a/app/src/main/res/drawable/pressed_bg_blue88.xml b/app/src/main/res/drawable/pressed_bg_blue88.xml new file mode 100644 index 0000000..f5832cc --- /dev/null +++ b/app/src/main/res/drawable/pressed_bg_blue88.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/presslr.xml b/app/src/main/res/drawable/presslr.xml new file mode 100644 index 0000000..4c52b70 --- /dev/null +++ b/app/src/main/res/drawable/presslr.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/presslrcir.xml b/app/src/main/res/drawable/presslrcir.xml new file mode 100644 index 0000000..44fab62 --- /dev/null +++ b/app/src/main/res/drawable/presslrcir.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/presslrsearch.xml b/app/src/main/res/drawable/presslrsearch.xml new file mode 100644 index 0000000..6ac48e8 --- /dev/null +++ b/app/src/main/res/drawable/presslrsearch.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/radius.xml b/app/src/main/res/drawable/radius.xml new file mode 100755 index 0000000..07ddc9d --- /dev/null +++ b/app/src/main/res/drawable/radius.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_a1.xml b/app/src/main/res/drawable/radius_a1.xml new file mode 100755 index 0000000..4c1fb56 --- /dev/null +++ b/app/src/main/res/drawable/radius_a1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_a2.xml b/app/src/main/res/drawable/radius_a2.xml new file mode 100755 index 0000000..10be0b5 --- /dev/null +++ b/app/src/main/res/drawable/radius_a2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_a3.xml b/app/src/main/res/drawable/radius_a3.xml new file mode 100755 index 0000000..e5b7150 --- /dev/null +++ b/app/src/main/res/drawable/radius_a3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_a4.xml b/app/src/main/res/drawable/radius_a4.xml new file mode 100755 index 0000000..3f68485 --- /dev/null +++ b/app/src/main/res/drawable/radius_a4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_b1.xml b/app/src/main/res/drawable/radius_b1.xml new file mode 100755 index 0000000..514cb42 --- /dev/null +++ b/app/src/main/res/drawable/radius_b1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_b2.xml b/app/src/main/res/drawable/radius_b2.xml new file mode 100755 index 0000000..65c57ed --- /dev/null +++ b/app/src/main/res/drawable/radius_b2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c1.xml b/app/src/main/res/drawable/radius_c1.xml new file mode 100755 index 0000000..839feee --- /dev/null +++ b/app/src/main/res/drawable/radius_c1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c2.xml b/app/src/main/res/drawable/radius_c2.xml new file mode 100755 index 0000000..6cfc060 --- /dev/null +++ b/app/src/main/res/drawable/radius_c2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c3.xml b/app/src/main/res/drawable/radius_c3.xml new file mode 100755 index 0000000..f2e5bb4 --- /dev/null +++ b/app/src/main/res/drawable/radius_c3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c4.xml b/app/src/main/res/drawable/radius_c4.xml new file mode 100755 index 0000000..bfb6ab2 --- /dev/null +++ b/app/src/main/res/drawable/radius_c4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c5.xml b/app/src/main/res/drawable/radius_c5.xml new file mode 100755 index 0000000..55a9ecc --- /dev/null +++ b/app/src/main/res/drawable/radius_c5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c6.xml b/app/src/main/res/drawable/radius_c6.xml new file mode 100755 index 0000000..6194d8d --- /dev/null +++ b/app/src/main/res/drawable/radius_c6.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_c7.xml b/app/src/main/res/drawable/radius_c7.xml new file mode 100755 index 0000000..3ae14dd --- /dev/null +++ b/app/src/main/res/drawable/radius_c7.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_d1.xml b/app/src/main/res/drawable/radius_d1.xml new file mode 100755 index 0000000..aee5efc --- /dev/null +++ b/app/src/main/res/drawable/radius_d1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_d2.xml b/app/src/main/res/drawable/radius_d2.xml new file mode 100755 index 0000000..cf6379c --- /dev/null +++ b/app/src/main/res/drawable/radius_d2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_d3.xml b/app/src/main/res/drawable/radius_d3.xml new file mode 100755 index 0000000..8fb4443 --- /dev/null +++ b/app/src/main/res/drawable/radius_d3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_d4.xml b/app/src/main/res/drawable/radius_d4.xml new file mode 100755 index 0000000..220044b --- /dev/null +++ b/app/src/main/res/drawable/radius_d4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_e1.xml b/app/src/main/res/drawable/radius_e1.xml new file mode 100755 index 0000000..27fd758 --- /dev/null +++ b/app/src/main/res/drawable/radius_e1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_e2.xml b/app/src/main/res/drawable/radius_e2.xml new file mode 100755 index 0000000..543ecff --- /dev/null +++ b/app/src/main/res/drawable/radius_e2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_e3.xml b/app/src/main/res/drawable/radius_e3.xml new file mode 100755 index 0000000..ce8393b --- /dev/null +++ b/app/src/main/res/drawable/radius_e3.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/radius_e4.xml b/app/src/main/res/drawable/radius_e4.xml new file mode 100755 index 0000000..be112f4 --- /dev/null +++ b/app/src/main/res/drawable/radius_e4.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/red_dot.xml b/app/src/main/res/drawable/red_dot.xml new file mode 100755 index 0000000..eb80fcc --- /dev/null +++ b/app/src/main/res/drawable/red_dot.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/search.png b/app/src/main/res/drawable/search.png new file mode 100644 index 0000000..e0f640d Binary files /dev/null and b/app/src/main/res/drawable/search.png differ diff --git a/app/src/main/res/drawable/selector_list_item.xml b/app/src/main/res/drawable/selector_list_item.xml new file mode 100755 index 0000000..24a5e0e --- /dev/null +++ b/app/src/main/res/drawable/selector_list_item.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape.xml b/app/src/main/res/drawable/shape.xml new file mode 100755 index 0000000..9159133 --- /dev/null +++ b/app/src/main/res/drawable/shape.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_5_blue.xml b/app/src/main/res/drawable/shape_bg_5_blue.xml new file mode 100644 index 0000000..42e87e8 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_5_blue.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_5_gray.xml b/app/src/main/res/drawable/shape_bg_5_gray.xml new file mode 100644 index 0000000..a823629 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_5_gray.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_5_white.xml b/app/src/main/res/drawable/shape_bg_5_white.xml new file mode 100644 index 0000000..68b6021 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_5_white.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_5_yellow.xml b/app/src/main/res/drawable/shape_bg_5_yellow.xml new file mode 100644 index 0000000..1091c9b --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_5_yellow.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bottom_corner.xml b/app/src/main/res/drawable/shape_bottom_corner.xml new file mode 100644 index 0000000..d5e525a --- /dev/null +++ b/app/src/main/res/drawable/shape_bottom_corner.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog_bg.xml b/app/src/main/res/drawable/shape_dialog_bg.xml new file mode 100644 index 0000000..f9012f4 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/sub.png b/app/src/main/res/drawable/sub.png new file mode 100644 index 0000000..1ed9ba1 Binary files /dev/null and b/app/src/main/res/drawable/sub.png differ diff --git a/app/src/main/res/drawable/text_underline.xml b/app/src/main/res/drawable/text_underline.xml new file mode 100644 index 0000000..2eb8c34 --- /dev/null +++ b/app/src/main/res/drawable/text_underline.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_add_member.xml b/app/src/main/res/layout/activity_add_member.xml new file mode 100644 index 0000000..f3ab57d --- /dev/null +++ b/app/src/main/res/layout/activity_add_member.xml @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_appointment.xml b/app/src/main/res/layout/activity_appointment.xml new file mode 100644 index 0000000..56d6338 --- /dev/null +++ b/app/src/main/res/layout/activity_appointment.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_appointment_date.xml b/app/src/main/res/layout/activity_appointment_date.xml new file mode 100644 index 0000000..657e606 --- /dev/null +++ b/app/src/main/res/layout/activity_appointment_date.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_appointment_list.xml b/app/src/main/res/layout/activity_appointment_list.xml new file mode 100644 index 0000000..9753803 --- /dev/null +++ b/app/src/main/res/layout/activity_appointment_list.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_appointment_search.xml b/app/src/main/res/layout/activity_appointment_search.xml new file mode 100644 index 0000000..59c4868 --- /dev/null +++ b/app/src/main/res/layout/activity_appointment_search.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_contact.xml b/app/src/main/res/layout/activity_contact.xml new file mode 100644 index 0000000..3357aee --- /dev/null +++ b/app/src/main/res/layout/activity_contact.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_exam_appointment.xml b/app/src/main/res/layout/activity_exam_appointment.xml new file mode 100644 index 0000000..25a9a20 --- /dev/null +++ b/app/src/main/res/layout/activity_exam_appointment.xml @@ -0,0 +1,1035 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +