package com.example.jhpapp.utils;

import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import androidx.core.content.FileProvider;

import java.io.File;
import java.io.IOException;

/**
 * 管理版本下载与安装  兼容7.0  8.0  9.0及以下
 * Created by Administrator on 2019/9/12.
 */
public class DownloadUtils {
	//下载器
	private DownloadManager downloadManager;
	private Context mContext;
	//下载的ID
	private long downloadId;
	private String name;
	private String pathstr;

	public DownloadUtils(Context context, String url, String name) {
		this.mContext = context;
		downloadAPK(url, name);
		this.name = name;
	}

	//下载apk
	private void downloadAPK(String url, String name) {
		//创建下载任务
		DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
		//移动网络情况下是否允许漫游
		request.setAllowedOverRoaming(false);
		//在通知栏中显示，默认就是显示的
		request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
		request.setTitle("普瑞眼科");
		request.setDescription("新版下载中...");
		request.setVisibleInDownloadsUi(true);
		request.setMimeType("application/vnd.android.package-archive");
		//设置下载的路径
		File file = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), name);
		request.setDestinationUri(Uri.fromFile(file));
		pathstr = file.getAbsolutePath();
		Log.i("jjjjkkkk","   下载路径："+pathstr);
		//获取DownloadManager
		if (downloadManager == null)
			downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
		//将下载请求加入下载队列，加入下载队列后会给该任务返回一个long型的id，通过该id可以取消任务，重启任务、获取下载的文件等等
		if (downloadManager != null) {
			downloadId = downloadManager.enqueue(request);
		}

		//注册广播接收者，监听下载状态
		mContext.registerReceiver(receiver,
				new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
	}

	//广播监听下载的各个状态
	private BroadcastReceiver receiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			checkStatus();
		}
	};

	//检查下载状态
	private void checkStatus() {
		DownloadManager.Query query = new DownloadManager.Query();
		//通过下载的id查找
		query.setFilterById(downloadId);
		Cursor cursor = downloadManager.query(query);
		if (cursor.moveToFirst()) {
			@SuppressLint("Range") int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
			switch (status) {
				//下载暂停
				case DownloadManager.STATUS_PAUSED:
					Log.i("jjjjkkkk","   下载暂停");
					break;
				//下载延迟
				case DownloadManager.STATUS_PENDING:
					Log.i("jjjjkkkk","   下载延迟");
					break;
				//正在下载
				case DownloadManager.STATUS_RUNNING:
					Log.i("jjjjkkkk","   正在下载");
					break;
				//下载完成
				case DownloadManager.STATUS_SUCCESSFUL:
					Log.i("jjjjkkkk","   下载完成");
					//下载完成安装APK
					installAPK();
					cursor.close();
					break;
				//下载失败
				case DownloadManager.STATUS_FAILED:
					Toast.makeText(mContext, "下载失败", Toast.LENGTH_SHORT).show();
					cursor.close();
					mContext.unregisterReceiver(receiver);
					break;
			}
		}
	}

	private void installAPK() {
		setPermission(pathstr);
		Intent intent = new Intent(Intent.ACTION_VIEW);
		// 由于没有在Activity环境下启动Activity,设置下面的标签
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		//Android 7.0以上要使用FileProvider
		if (Build.VERSION.SDK_INT >= 24) {
//			Log.i("jjjjkkkk","   Utils >=24:"+pathstr);
			File file = (new File(pathstr));
			//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
			Uri apkUri = FileProvider.getUriForFile(mContext, "com.example.prandroidwebview.fileprovider", file);
			//添加这一句表示对目标应用临时授权该Uri所代表的文件
			intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
			intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
		} else {
//			Log.i("jjjjkkkk","   Utils <24:"+Uri.parse("file://" + pathstr));
			intent.setDataAndType(Uri.parse("file://" + pathstr),
					"application/vnd.android.package-archive");
		}
		mContext.startActivity(intent);
	}

	//修改文件权限
	private void setPermission(String absolutePath) {
		String command = "chmod " + "777" + " " + absolutePath;
		Runtime runtime = Runtime.getRuntime();
		try {
			runtime.exec(command);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
