diff --git a/app/build.gradle b/app/build.gradle index 4bbc822..deefb64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -25,8 +25,8 @@ android { applicationId "com.hjx.parent" minSdk 24 targetSdk 32 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bf4f511..5ee6330 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,7 +24,11 @@ + + + { } } + @Override + protected void onResume() { + super.onResume(); + getError(getResources().getStringArray(R.array.filter_subject)[subject]); + } + public class HandlerCallBack implements IHandlerCallBack { private String TAG = "---ImagePicker---"; List photoList = new ArrayList<>(); diff --git a/app/src/main/java/com/hjx/parent/ErrorDetailActivity.java b/app/src/main/java/com/hjx/parent/ErrorDetailActivity.java index dd04804..219f39e 100644 --- a/app/src/main/java/com/hjx/parent/ErrorDetailActivity.java +++ b/app/src/main/java/com/hjx/parent/ErrorDetailActivity.java @@ -1,7 +1,11 @@ package com.hjx.parent; +import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; import android.text.TextUtils; +import android.view.MotionEvent; import android.view.View; import android.webkit.WebSettings; import android.widget.AdapterView; @@ -37,6 +41,7 @@ public class ErrorDetailActivity extends BaseActivity"; String body = "
" + linkCss + "
" + errorDetailBean.getMethod() + ""; binding.webAnalyse.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null); + binding.webAnalyse.setBackgroundColor(Color.parseColor("#F5F5F5")); } if (TextUtils.isEmpty(errorDetailBean.getDisplayAnswer())) { binding.llAnswer.setVisibility(View.GONE); @@ -72,6 +85,7 @@ public class ErrorDetailActivity extends BaseActivity"; String body = "
" + linkCss + "
" + errorDetailBean.getDisplayAnswer() + ""; binding.webAnswer.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null); + binding.webAnswer.setBackgroundColor(Color.parseColor("#F5F5F5")); } if (errorDetailBean.getPoints().size() > 0) { List points = new ArrayList<>(); @@ -89,6 +103,7 @@ public class ErrorDetailActivity extends BaseActivity map = new HashMap<>(); map.put("bookId", bean.getId()); - map.put("controlFlag", done == 1 ? 0 : 1); + map.put("controlFlag", done); map.put("errorReason", binding.spinnerReason.getSelectedItemPosition()); NetWorks.editError(map, new Observer() { @Override @@ -164,7 +185,7 @@ public class ErrorDetailActivity extends BaseActivity im return ActivityErrorListBinding.inflate(getLayoutInflater()); } + + @Override public void onClick(View v) { switch (v.getId()) { @@ -202,10 +204,10 @@ public class ErrorListActivity extends BaseActivity im }); break; case R.id.tv_add: - if (!XXPermissions.isGranted(context, Permission.CAMERA, Permission.WRITE_EXTERNAL_STORAGE)) { + if (!XXPermissions.isGranted(context, Permission.CAMERA, Permission.MANAGE_EXTERNAL_STORAGE)) { XXPermissions.with(context) // 申请多个权限 - .permission(Permission.CAMERA) + .permission(Permission.CAMERA, Permission.MANAGE_EXTERNAL_STORAGE) .request(new OnPermissionCallback() { @Override public void onGranted(List permissions, boolean all) { diff --git a/app/src/main/java/com/hjx/parent/MainActivity.java b/app/src/main/java/com/hjx/parent/MainActivity.java index e53dbc5..0ee0b53 100644 --- a/app/src/main/java/com/hjx/parent/MainActivity.java +++ b/app/src/main/java/com/hjx/parent/MainActivity.java @@ -2,26 +2,44 @@ package com.hjx.parent; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.FileProvider; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Intent; import android.graphics.Color; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Looper; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.google.gson.JsonObject; +import com.hjq.permissions.OnPermissionCallback; +import com.hjq.permissions.Permission; +import com.hjq.permissions.XXPermissions; +import com.hjx.parent.dialog.TipDialog; import com.hjx.parent.fragment.HomeFragment; import com.hjx.parent.fragment.MeFragment; import com.prws.common.base.BaseActivity; import com.prws.common.base.BasePresenter; import com.prws.common.bean.GradeAndSubject; import com.prws.common.bean.ResponseResult; +import com.prws.common.bean.UpdateBean; import com.prws.common.net.NetWorks; +import com.prws.common.utils.DownloadUtil; import com.prws.common.utils.SharedPreferencesUtil; +import java.io.File; import java.util.List; import io.reactivex.Observer; import io.reactivex.disposables.Disposable; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; public class MainActivity extends BaseActivity { @@ -101,6 +119,7 @@ public class MainActivity extends BaseActivity { } }); + checkUpdate(); } public HomeFragment getHomeFragment() { @@ -144,4 +163,111 @@ public class MainActivity extends BaseActivity { public void onNetChanged(int netWorkState) { } + + public void downloadApk(String url, int versionCode) { + String filepath = getExternalFilesDir("apk").getPath() + "/" + versionCode + ".apk"; + ProgressDialog dialog = new ProgressDialog(this); + dialog.setTitle("版本更新"); + dialog.setMessage("正在下载新版本,请稍后"); + dialog.setMax(100); + dialog.setProgress(0); + dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); + dialog.show(); + DownloadUtil.download(url, filepath, new DownloadUtil.OnDownloadListener() { + @Override + public void onDownloadSuccess(String path) { + dialog.setProgress(100); + dialog.dismiss(); + installApk(filepath); + } + + @Override + public void onDownloading(int progress) { + dialog.setProgress(progress); + } + + @Override + public void onDownloadFailed(String msg) { + dialog.dismiss(); + Looper.prepare(); + showToast("下载失败。"); + Looper.loop(); + } + }); + } + + public void installApk(String path) { + //开启扫码界面 + Intent intentUpdate = new Intent("android.intent.action.VIEW"); + intentUpdate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //对Android N及以上的版本做判断 + Uri apkUriN = FileProvider.getUriForFile(MainActivity.this, + getApplicationContext().getPackageName() + ".fileprovider", new File(path)); + intentUpdate.addCategory("android.intent.category.DEFAULT"); + intentUpdate.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //天假Flag 表示我们需要什么权限 + intentUpdate.setDataAndType(apkUriN, "application/vnd.android.package-archive"); + } else { + Uri apkUri = Uri.fromFile(new File(path)); + intentUpdate.setDataAndType(apkUri, "application/vnd.android.package-archive"); + } + startActivity(intentUpdate); + } + + public void checkUpdate() { + NetWorks.checkUpdate(BuildConfig.VERSION_CODE, BuildConfig.APPLICATION_ID, new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.body() != null && response.body().getCode() == 200) { + if (response.body().getData() != null) { + String msg = response.body().getData().getExplain(); + String url = response.body().getData().getUrl(); + int versionCode = response.body().getData().getVersion(); + showUpdateDialog(msg, url, versionCode); + } + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + } + }); + } + + public void showUpdateDialog(String msg, String url, int versionCode) { + TipDialog tipDialog = new TipDialog(this, "检测到新版本", msg, "升级", "取消", new TipDialog.TipDialogInterface() { + @Override + public void onConfirm(Dialog dialog) { + if (!XXPermissions.isGranted(MainActivity.this, Permission.MANAGE_EXTERNAL_STORAGE)) { + XXPermissions.with(MainActivity.this) + // 申请多个权限 + .permission(Permission.MANAGE_EXTERNAL_STORAGE) + .request(new OnPermissionCallback() { + @Override + public void onGranted(List permissions, boolean all) { + if (all) { + //开启扫码界面 + downloadApk(url, versionCode); + } else { + Toast.makeText(MainActivity.this, "需要权限", Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onDenied(List permissions, boolean never) { + XXPermissions.startPermissionActivity(MainActivity.this, permissions); + } + }); + } else { + downloadApk(url, versionCode); + } + + } + + @Override + public void onCancel(Dialog dialog) { + dialog.dismiss(); + } + }); + tipDialog.show(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java b/app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java index 9e79b1a..0ac6aa7 100644 --- a/app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java +++ b/app/src/main/java/com/hjx/parent/adapter/ErrorAdapter.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.WebSettings; @@ -136,6 +137,23 @@ public class ErrorAdapter extends RecyclerView.Adapter // settings.setSupportZoom(false);//设定支持缩放 holder.binding.webview.loadDataWithBaseURL(linkCss, body, "text/html", "UTF-8", null); holder.binding.webview.setVisibility(View.VISIBLE); + holder.binding.webview.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_UP) { + if (edit) { + list.get(position).setCheck(!topicBean.isCheck()); + notifyItemChanged(position); + checkInterface.onErrorCheck(); + } else { + Intent intent = new Intent(context, ErrorDetailActivity.class); + intent.putExtra("errorBean", topicBean); + context.startActivity(intent); + } + } + return true; + } + }); if (bean.getPoints().size() > 0) { String topic = context.getString(R.string.topic_start); topic += ":"; diff --git a/app/src/main/res/layout/activity_error_detail.xml b/app/src/main/res/layout/activity_error_detail.xml index 48a4d7d..91b3e41 100644 --- a/app/src/main/res/layout/activity_error_detail.xml +++ b/app/src/main/res/layout/activity_error_detail.xml @@ -142,6 +142,7 @@ @@ -176,6 +177,7 @@ android:id="@+id/web_answer" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:background="#F5F5F5" android:layout_margin="10dp" /> @@ -300,6 +302,17 @@ android:textSize="14sp" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9fcd05b..1ae5b83 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -50,8 +50,8 @@ @color/border none 1dp + 15sp - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7716ced..130fa04 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { url = [ - server_url : "http://192.168.3.155:8088", //http 请求指令 + server_url : "http://192.168.3.37:8088", //http 请求指令 server_url_online: "https://mgr.hjx.com", //http 请求指令 ] diff --git a/libs/common/src/main/java/com/prws/common/base/BaseActivity.java b/libs/common/src/main/java/com/prws/common/base/BaseActivity.java index ecdd74c..9410b1f 100644 --- a/libs/common/src/main/java/com/prws/common/base/BaseActivity.java +++ b/libs/common/src/main/java/com/prws/common/base/BaseActivity.java @@ -121,6 +121,7 @@ public abstract class BaseActivity

extends Ap p.bindView(this); } + public void showDialog(String title, String message, String confirm, String cancel, DialogInterface.OnClickListener cancelListener, DialogInterface.OnClickListener listener) { AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Light_Dialog_Alert); builder.setTitle(title); diff --git a/libs/common/src/main/java/com/prws/common/bean/UpdateBean.java b/libs/common/src/main/java/com/prws/common/bean/UpdateBean.java new file mode 100644 index 0000000..d0efc44 --- /dev/null +++ b/libs/common/src/main/java/com/prws/common/bean/UpdateBean.java @@ -0,0 +1,31 @@ +package com.prws.common.bean; + +public class UpdateBean { + private String explain; + private Integer version; + private String url; + + public void setExplain(String explain) { + this.explain = explain; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getExplain() { + return explain; + } + + public Integer getVersion() { + return version; + } + + public String getUrl() { + return url; + } +} diff --git a/libs/common/src/main/java/com/prws/common/net/NetWorks.java b/libs/common/src/main/java/com/prws/common/net/NetWorks.java index 415d753..4a8cf4d 100644 --- a/libs/common/src/main/java/com/prws/common/net/NetWorks.java +++ b/libs/common/src/main/java/com/prws/common/net/NetWorks.java @@ -12,6 +12,7 @@ import com.prws.common.bean.ResponseResult; import com.prws.common.bean.ScheduleBean; import com.prws.common.bean.Teacher; import com.prws.common.bean.TopicBean; +import com.prws.common.bean.UpdateBean; import com.prws.common.utils.SharedPreferencesUtil; import java.io.File; @@ -168,6 +169,10 @@ public class NetWorks extends RetrofitUtils { @POST("api/v1/question/editErrorBook") Observable editError(@Header("Authorization") String Authorization, @Body Map map); + + @GET("api/v1/resource/checkUpdate") + Call> checkUpdate(@Query("version") int version, @Query("packageName") String packageName, @Query("type") int type); + } @@ -180,6 +185,10 @@ public class NetWorks extends RetrofitUtils { } + public static void checkUpdate(int code, String packageName, Callback> callback) { + service_url.checkUpdate(code, packageName, 0).enqueue(callback); + } + public static void addError(String path, Map param, Observer observer) { File file = new File(path); RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file); diff --git a/libs/common/src/main/java/com/prws/common/utils/DownloadUtil.java b/libs/common/src/main/java/com/prws/common/utils/DownloadUtil.java new file mode 100644 index 0000000..dcc3107 --- /dev/null +++ b/libs/common/src/main/java/com/prws/common/utils/DownloadUtil.java @@ -0,0 +1,71 @@ +package com.prws.common.utils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class DownloadUtil { + + public static void download(final String url, final String saveFile, final OnDownloadListener listener) { + Request request = new Request.Builder().url(url).build(); + new OkHttpClient().newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + listener.onDownloadFailed(e.getMessage()); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + InputStream is = null; + byte[] buf = new byte[2048]; + int len; + FileOutputStream fos = null; + try { + is = response.body().byteStream(); + long total = response.body().contentLength(); + File file = new File(saveFile); + fos = new FileOutputStream(file); + long sum = 0; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + sum += len; + int progress = (int) (sum * 1.0f / total * 100); + listener.onDownloading(progress); + } + fos.flush(); + listener.onDownloadSuccess(file.getAbsolutePath()); + } catch (Exception e) { + listener.onDownloadFailed(e.getMessage()); + } finally { + try { + if (is != null) + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (fos != null) + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }); + } + + public interface OnDownloadListener { + void onDownloadSuccess(String path); + + void onDownloading(int progress); + + void onDownloadFailed(String msg); + } +} diff --git a/libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java b/libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java index 9ba203d..5dd8aaa 100644 --- a/libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java +++ b/libs/common/src/main/java/com/prws/common/widget/MarkSizeView.java @@ -172,7 +172,7 @@ public class MarkSizeView extends View { //draw button if (isValid && isUp) { - if (markedArea.width() >= CommonUtil.dpToPx(context, 40) && markedArea.height() >= CommonUtil.dpToPx(context, 40)) { + if (markedArea.width() >= CommonUtil.dpToPx(context, 30) && markedArea.height() >= CommonUtil.dpToPx(context, 30)) { canvas.drawBitmap(confirmBitmap, null, confirmArea, mBitPaint); canvas.drawBitmap(cancelBitmap, null, cancelArea, mBitPaint); } @@ -255,7 +255,7 @@ public class MarkSizeView extends View { break; case MotionEvent.ACTION_UP: isUp = true; - if (markedArea.width() >= CommonUtil.dpToPx(context, 40) && markedArea.height() >= CommonUtil.dpToPx(context, 40)) { + if (markedArea.width() >= CommonUtil.dpToPx(context, 30) && markedArea.height() >= CommonUtil.dpToPx(context, 30)) { if (isButtonClicked) { break; }