Compare commits

...

21 Commits

@ -1,2 +1,17 @@
# timeUse
# 本产品用于更好的管理您的时间,提高时间的利用效率
# 您可在本产品设置任务来对自己的行程进行规划
# 您还可在本产品查看各个应用的使用情况,包括今日、昨日和最近一周的情况
# 以下是注意事项
# 在安装本软件后, 第一次打开本软件时请根据提示赋予本软件获取其他应用使用情况的权限
# 赋予权限后,请先前往软件分类界面完成应用分类,再前往应用使用情况界面查看应用使用情况
# 如果想在分析报告界面的今日报告中查看准确的分析信息,请在前往分析报告界面前,先前往应用使用情# 况界面
# 在进入新的一天后,如果您想进入分析报告界面,同样请先前往应用使用情况界面

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

@ -11,10 +11,14 @@
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/drawable/ic_launcher_background.xml" value="0.171" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/drawable/list_round_btn.xml" value="0.2445" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/drawable/show_btn_color.xml" value="0.1965" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/drawable/tab_color.xml" value="0.1405" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/drawable/text_basic.xml" value="0.24" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_a.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_abc.xml" value="0.6" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_add_task.xml" value="0.259375" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_add_task2.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_app_classify.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_app_time.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_app_time_use.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_login.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_main.xml" value="0.264" />
@ -25,11 +29,15 @@
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_task_add.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/activity_task_show.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/appitem.xml" value="0.27291666666666664" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/classify_item.xml" value="0.27291666666666664" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/dialog.xml" value="0.32175925925925924" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_app_use.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_main_tab.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_report.xml" value="0.259375" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_task_list.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_today.xml" value="0.264" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_week.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/fragment_yesterday.xml" value="0.20546875" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/main_tab.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/tab.xml" value="0.27395833333333336" />
<entry key="..\:/study/Android Studio/AndroidProject/timeUse/app/src/main/res/layout/taskitem.xml" value="0.264" />

@ -2,6 +2,10 @@ plugins {
id 'com.android.application'
}
dependencies {
implementation files('libs/MPAndroidChart-v3.0.3.jar')
}
android {
compileSdk 32

@ -18,7 +18,7 @@
android:theme="@style/Theme.TimeUse"
tools:targetApi="31">
<activity
android:name=".add_task"
android:name=".appTime"
android:exported="false" />
<activity
android:name=".software_classification"
@ -32,9 +32,6 @@
<activity
android:name=".task_add"
android:exported="false" />
<activity
android:name=".show_task"
android:exported="false" />
<activity
android:name=".appTimeUse"
android:exported="false" />

@ -2,21 +2,50 @@ package com.tanshui.timeuse;
import android.graphics.drawable.Drawable;
import java.util.List;
public class AppInfo {
public int uid;
public String label;//应用名称
public String package_name;//应用包名
public Drawable icon;//应用icon
public List<String> times;
private int uid;
private String label;//应用名称
private String package_name;//应用包名
private Drawable icon;//应用icon
private long timeLong;
private String timeString;
private String classify;
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public long getTimeLong() {
return timeLong;
}
public void setTimeLong(long timeLong) {
this.timeLong = timeLong;
}
public String getTimeString() {
return timeString;
}
public void setTimeString(String timeString) {
this.timeString = timeString;
}
public String getClassify() {
return classify;
}
public void setClassify(String classify) {
this.classify = classify;
}
public AppInfo() {
uid = 0;
label = "";
package_name = "";
icon = null;
times=null;
}
public int getUid() {

@ -1,25 +1,18 @@
package com.tanshui.timeuse;
import android.content.ContentValues;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import android.widget.Toast;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CheckboxAdapter extends BaseAdapter {
private List<HashMap<String, Object>> list;

@ -1,76 +0,0 @@
package com.tanshui.timeuse;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AppOpsManager;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MainActivity extends AppCompatActivity {
private Button app_use;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
app_use = findViewById(R.id.app_use);
//如没有开启应用权限,则开启
if (!isStatAccessPermissionSet()) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
this.startActivity(intent);
}
app_use.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,appTimeUse.class);
startActivity(intent);
}
});
}
// 开启应用访问权限
public boolean isStatAccessPermissionSet() {
try {
PackageManager packageManager = this.getPackageManager();
ApplicationInfo info = packageManager.getApplicationInfo(this.getPackageName(), 0);
AppOpsManager appOpsManager = (AppOpsManager) this.getSystemService(APP_OPS_SERVICE);
return appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

@ -0,0 +1,66 @@
package com.tanshui.timeuse;
public class PieInfo {
private float startAngle; // 开始绘制的角度
private float sweepAngle; // 扫过的角度
private int color; // 显示的颜色
private float percent; // 所占百分比
public float getStartAngle() {
return startAngle;
}
public void setStartAngle(float startAngle) {
this.startAngle = startAngle;
}
public float getSweepAngle() {
return sweepAngle;
}
public void setSweepAngle(float sweepAngle) {
this.sweepAngle = sweepAngle;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
public float getPercent() {
return percent;
}
public void setPercent(float percent) {
this.percent = percent;
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
private boolean selected; // true为选中
public PieInfo(int color, float percent) {
this.color = color;
this.percent = percent;
}
public PieInfo(int color, float percent, boolean selected) {
this.color = color;
this.percent = percent;
this.selected = selected;
}
}

@ -1,6 +1,5 @@
package com.tanshui.timeuse;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
@ -9,5 +8,4 @@ public class ViewHolder {
public TextView startTime=null;
public TextView endTime=null;
public CheckBox isFinished=null;
public Button deleteTask=null;
}

@ -1,28 +0,0 @@
package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.tanshui.timeuse.database.timeUseDBHelper;
public class add_task extends AppCompatActivity {
private timeUseDBHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_task);
}
@Override
protected void onStart() {
super.onStart();
dbHelper = timeUseDBHelper.getInstance(this);
dbHelper.openReadLink();
}
@Override
protected void onStop() {
super.onStop();
dbHelper.closeLink();
}
}

@ -0,0 +1,252 @@
package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.tanshui.timeuse.database.timeUseDBHelper;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class appTime extends AppCompatActivity {
private ProgressDialog progressDialog;
private String date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_time);
ArrayList<AppInfo> mApplicationInfos;
timeUseDBHelper dbHelper;
List<AppInfo> appInfoList;
SimpleAdapter simpleAdapter;
dbHelper = timeUseDBHelper.getInstance(this);
dbHelper.openWriteLink();
dbHelper.openReadLink();
appInfoList=dbHelper.queryAllClassifyInfo();
showProgressDialog("1","11");
ListView lv_app = findViewById(R.id.lv_app1);
Button list = findViewById(R.id.jump_app_list1);
Button report = findViewById(R.id.jump_app_report1);
Button appClassify =findViewById(R.id.jump_app_appClassify1);
// 接受传的date
Intent intent1=getIntent();
date = intent1.getStringExtra("date");
list.setOnClickListener(v -> {
Intent intent=new Intent(appTime.this,task_show.class);
startActivity(intent);
});
report.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(appTime.this, report.class);
intent.putExtra("date",date);
showProgressDialog("","正在加载");
startActivity(intent);
});
appClassify.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(appTime.this, software_classification.class);
intent.putExtra("date",date);
startActivity(intent);
});
mApplicationInfos=getAllAppInfo(this);
// 从早上8点开始监听
Calendar setBeginCal=Calendar.getInstance();
Calendar setEndCal=Calendar.getInstance();
Calendar beginCal = Calendar.getInstance();
int hour = beginCal.get(Calendar.HOUR_OF_DAY);
int minute = beginCal.get(Calendar.MINUTE);
int second = beginCal.get(Calendar.SECOND);
setBeginCal.add(Calendar.SECOND, -1 * second);
setBeginCal.add(Calendar.MINUTE, -1 * minute);
setBeginCal.add(Calendar.HOUR, -1 * hour+8);
setEndCal.add(Calendar.SECOND, -1 * second);
setEndCal.add(Calendar.MINUTE, -1 * minute);
setEndCal.add(Calendar.HOUR, -1 * hour+10);
beginCal.add(Calendar.SECOND, -1 * second);
beginCal.add(Calendar.MINUTE, -1 * minute);
beginCal.add(Calendar.HOUR, -1 * hour+8);
Calendar endCal = Calendar.getInstance();
UsageStatsManager manager=(UsageStatsManager)getApplicationContext().getSystemService(USAGE_STATS_SERVICE);
List<UsageStats> stats=manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,beginCal.getTimeInMillis(),endCal.getTimeInMillis());
Map<String, UsageStats> statsMap = manager.queryAndAggregateUsageStats(setBeginCal.getTimeInMillis(), setEndCal.getTimeInMillis());
ArrayList<HashMap<String, Object>> listItem = new ArrayList<>();
List<String> name = new ArrayList<>();
List<Drawable> icons = new ArrayList<>();
for(UsageStats us:stats){
try {
PackageManager pm=getApplicationContext().getPackageManager();
ApplicationInfo applicationInfo=pm.getApplicationInfo(us.getPackageName(),PackageManager.GET_META_DATA);
// Toast.makeText(this, appInfo.package_name, Toast.LENGTH_SHORT).show();
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_CONFIGURATIONS);
int flags = packageInfo.applicationInfo.flags;
// SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
//
// String t=format.format(new Date(us.getLastTimeUsed()));
// long t1=us.getLastTimeStamp();
// String t2=format.format(new Date(us.getLastTimeUsed()));
String appName = "";
Drawable icon=null;
for(AppInfo app:mApplicationInfos){
if(applicationInfo.packageName.equals(app.getPackage_name())){
appName=app.getLabel();
name.add(appName);
icon=app.getIcon();
icons.add(icon);
}
}
if(getTimeFromInt(us.getTotalTimeInForeground())!="已结束"){
UsageStats usageStats=statsMap.get(applicationInfo.packageName);
// 判断是否为系统应用系统
if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){
AppInfo appInfo=new AppInfo();
HashMap<String,Object> map = new HashMap<>();
//加入图片
map.put("ItemImage", icon);
// 添加app名称
map.put("ItemLabel", appName);
appInfo.setLabel(appName);
// 添加app使用时间
map.put("ItemTime","今天使用时间:"+getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setTimeString(getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setTimeLong(usageStats.getTotalTimeInForeground());
appInfo.setPackage_name(applicationInfo.packageName);
// dbHelper=timeUseDBHelper.getInstance(this);
if(dbHelper.searchPacketName(appInfo.getPackage_name(),"appList")){
// 修改时间
dbHelper.updateAppUseTime(appInfo,date);
}else{
for(AppInfo app:appInfoList){
if(app.getPackage_name().equals(appInfo.getPackage_name()))
appInfo.setClassify(app.getClassify());
}
dbHelper.insertAppInfos(appInfo,date);
}
listItem.add(map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
simpleAdapter = new SimpleAdapter(this,
//绑定的数据
listItem,
//每一行的布局
R.layout.appitem,
//动态数组中的数据源的键映射到布局文件对应的控件中
new String[] {"ItemImage", "ItemLabel","ItemTime"},
new int[] {R.id.iv_appIcon, R.id.label,R.id.times});
lv_app.setAdapter(simpleAdapter);
// 显示app图标
simpleAdapter.setViewBinder((view, o, s) -> {
if(view instanceof ImageView && o instanceof Drawable){
ImageView iv=(ImageView)view;
iv.setImageDrawable((Drawable)o);
return true;
}
else return false;
});
hideProgressDialog();
}
// 弹出正在加载弹窗
public void showProgressDialog(String title, String message) {
if (progressDialog == null) {
progressDialog = ProgressDialog.show(appTime.this,
title, message, true, false);
} else if (progressDialog.isShowing()) {
progressDialog.setTitle(title);
progressDialog.setMessage(message);
}
progressDialog.show();
}
public ArrayList<AppInfo> getAllAppInfo(Context ctx) {
ArrayList<AppInfo> appBeanList = new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setIcon(p.applicationInfo.loadIcon(packageManager));
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
bean.setPackage_name(p.applicationInfo.packageName);
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
}
}
return appBeanList;
}
// 隐藏提示加载弹窗
public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog=null;
}
public static String getTimeFromInt(long time) {
if (time <= 0) { return "已结束"; }
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
return hour+"小时"+minute+"分钟"+second+"秒";
}
}

@ -2,7 +2,7 @@ package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AppOpsManager;
import android.app.ProgressDialog;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
@ -12,61 +12,174 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import com.tanshui.timeuse.database.timeUseDBHelper;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class appTimeUse extends AppCompatActivity {
private ListView lv_app;
private ProgressDialog progressDialog;
private String date;
private ArrayList<AppInfo> mApplicationInfos;
private Button list;
private Button report;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_time_use);
lv_app = findViewById(R.id.lv_app);
list=findViewById(R.id.jump_app_list);
report=findViewById(R.id.jump_app_report);
// 如果第一次打开查看app使用界面打开应用权限
if (!isStatAccessPermissionSet()) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
this.startActivity(intent);
}
list.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(appTimeUse.this,task_show.class);
startActivity(intent);
}
ArrayList<HashMap<String, Object>> listItem;
timeUseDBHelper dbHelper;
SimpleAdapter simpleAdapter;
dbHelper = timeUseDBHelper.getInstance(this);
dbHelper.openWriteLink();
dbHelper.openReadLink();
showProgressDialog("1","11");
ListView lv_app = findViewById(R.id.lv_app);
Button list = findViewById(R.id.jump_app_list);
Button report = findViewById(R.id.jump_app_report);
Button appClassify =findViewById(R.id.jump_app_appClassify);
// 接受task_show传的date
Intent intent1=getIntent();
date = intent1.getStringExtra("date");
list.setOnClickListener(v -> {
Intent intent=new Intent(appTimeUse.this,task_show.class);
startActivity(intent);
});
report.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(appTimeUse.this, report.class);
intent.putExtra("date",date);
showProgressDialog("","正在加载");
startActivity(intent);
});
appClassify.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(appTimeUse.this, software_classification.class);
intent.putExtra("date",date);
startActivity(intent);
});
report.setOnClickListener(new View.OnClickListener() {
mApplicationInfos=getAllAppInfo(this);
listItem = new ArrayList<>();
listItem =getApp(dbHelper);
// ---------------------------------------
simpleAdapter = new SimpleAdapter(this,
//绑定的数据
listItem,
//每一行的布局
R.layout.appitem,
//动态数组中的数据源的键映射到布局文件对应的控件中
new String[] {"ItemImage", "ItemLabel","ItemTime"},
new int[] {R.id.iv_appIcon, R.id.label,R.id.times});
lv_app.setAdapter(simpleAdapter);
// 显示app图标
simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public void onClick(View v) {
Intent intent=new Intent(appTimeUse.this,report.class);
startActivity(intent);
public boolean setViewValue(View view, Object o, String s) {
if(view instanceof ImageView && o instanceof Drawable){
ImageView iv=(ImageView)view;
iv.setImageDrawable((Drawable)o);
return true;
}
else return false;
}
});
hideProgressDialog();
}
@Override
protected void onStart() {
super.onStart();
mApplicationInfos=getAllAppInfo(this);
// 从早上8点开始监听
// 从数据库获取applist
// appInfoList=dbHelper.queryAllAppInfo();
}
public static String getTimeFromInt(long time) {
if (time <= 0) { return "已结束"; }
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
return hour+"小时"+minute+"分钟"+second+"秒";
}
/**
*
* @param ctx
* isFilterSystem
*/
public ArrayList<AppInfo> getAllAppInfo(Context ctx) {
ArrayList<AppInfo> appBeanList = new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setIcon(p.applicationInfo.loadIcon(packageManager));
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
bean.setPackage_name(p.applicationInfo.packageName);
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
}
}
return appBeanList;
}
// 弹出正在加载弹窗
public void showProgressDialog(String title, String message) {
if (progressDialog == null) {
progressDialog = ProgressDialog.show(appTimeUse.this,
title, message, true, false);
} else if (progressDialog.isShowing()) {
progressDialog.setTitle(title);
progressDialog.setMessage(message);
}
progressDialog.show();
}
// 隐藏提示加载弹窗
public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog=null;
}
// 获取应用信息
public ArrayList<HashMap<String, Object>> getApp(timeUseDBHelper dbHelper){
// 从早上8点开始监听
Calendar setBeginCal=Calendar.getInstance();
@ -74,9 +187,6 @@ public class appTimeUse extends AppCompatActivity {
Calendar beginCal = Calendar.getInstance();
// beginCal.set(Calendar.HOUR_OF_DAY,8);
// beginCal.set(Calendar.MINUTE,0);
// beginCal.set(Calendar.SECOND,0);
int hour = beginCal.get(Calendar.HOUR_OF_DAY);
int minute = beginCal.get(Calendar.MINUTE);
int second = beginCal.get(Calendar.SECOND);
@ -108,20 +218,22 @@ public class appTimeUse extends AppCompatActivity {
try {
PackageManager pm=getApplicationContext().getPackageManager();
ApplicationInfo applicationInfo=pm.getApplicationInfo(us.getPackageName(),PackageManager.GET_META_DATA);
// Toast.makeText(this, appInfo.package_name, Toast.LENGTH_SHORT).show();
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_CONFIGURATIONS);
int flags = packageInfo.applicationInfo.flags;
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
String t=format.format(new Date(us.getLastTimeUsed()));
long t1=us.getLastTimeStamp();
String t2=format.format(new Date(us.getLastTimeUsed()));
// SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
//
// String t=format.format(new Date(us.getLastTimeUsed()));
// long t1=us.getLastTimeStamp();
// String t2=format.format(new Date(us.getLastTimeUsed()));
String appName = "";
Drawable icon=null;
for(AppInfo app:mApplicationInfos){
if(applicationInfo.packageName.equals(app.package_name)){
appName=app.label;
if(applicationInfo.packageName.equals(app.getPackage_name())){
appName=app.getLabel();
name.add(appName);
icon=app.icon;
icon=app.getIcon();
icons.add(icon);
}
}
@ -130,100 +242,41 @@ public class appTimeUse extends AppCompatActivity {
UsageStats usageStats=statsMap.get(applicationInfo.packageName);
// 判断是否为系统应用系统
if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){
HashMap<String,Object> map = new HashMap<>();
//加入图片
map.put("ItemImage", icon);
AppInfo appInfo=new AppInfo();
HashMap<String,Object> map = new HashMap<>();
//加入图片
map.put("ItemImage", icon);
// 添加app名称
map.put("ItemLabel", appName);
// 添加app使用时间
map.put("ItemTime",getTimeFromInt(usageStats.getTotalTimeInForeground()));
listItem.add(map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
SimpleAdapter adapter = new SimpleAdapter(this,
//绑定的数据
listItem,
//每一行的布局
R.layout.appitem,
//动态数组中的数据源的键映射到布局文件对应的控件中
new String[] {"ItemImage", "ItemLabel","ItemTime"},
new int[] {R.id.iv_appIcon, R.id.label,R.id.times});
lv_app.setAdapter(adapter);
// 显示app图标
adapter.setViewBinder(new SimpleAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Object o, String s) {
if(view instanceof ImageView && o instanceof Drawable){
map.put("ItemLabel", appName);
appInfo.setLabel(appName);
// 添加app使用时间
map.put("ItemTime","今天使用时间:"+getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setTimeString(getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setTimeLong(usageStats.getTotalTimeInForeground());
appInfo.setPackage_name(applicationInfo.packageName);
ImageView iv=(ImageView)view;
iv.setImageDrawable((Drawable)o);
return true;
}
else return false;
}
});
// t1.setText(sb1);
}
public static String getTimeFromInt(long time) {
// dbHelper=timeUseDBHelper.getInstance(this);
if (time <= 0) { return "已结束"; }
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(dbHelper.searchPacketName(appInfo.getPackage_name(),"appList")){
// 修改时间
dbHelper.updateAppUseTime(appInfo,date);
}else{
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
dbHelper.insertAppInfos(appInfo,date);
}
listItem.add(map);
}
return "今天使用时间:"+hour+"小时"+minute+"分钟"+second+"秒";
}
}
/**
*
* @param ctx
* isFilterSystem
* @return
*/
public ArrayList<AppInfo> getAllAppInfo(Context ctx) {
ArrayList<AppInfo> appBeanList = new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setIcon(p.applicationInfo.loadIcon(packageManager));
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
bean.setPackage_name(p.applicationInfo.packageName);
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
} catch (Exception e) {
e.printStackTrace();
}
}
return appBeanList;
}
// 打开应用权限
public boolean isStatAccessPermissionSet() {
try {
PackageManager packageManager = this.getPackageManager();
ApplicationInfo info = packageManager.getApplicationInfo(this.getPackageName(), 0);
AppOpsManager appOpsManager = (AppOpsManager) this.getSystemService(APP_OPS_SERVICE);
return appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return listItem;
}
}

@ -5,9 +5,9 @@ import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import com.tanshui.timeuse.AppInfo;
import com.tanshui.timeuse.taskInfo;
import java.util.ArrayList;
@ -17,6 +17,10 @@ public class timeUseDBHelper extends SQLiteOpenHelper {
private static final String DB_NAME="timeUse.db";
private static final String TABLE_taskList="taskList";
private static final String TABLE_UserList="UserList";
private static final String TABLE_appList="appList";
private static final String TABLE_appListYesterday="appListYesterday";
private static final String TABLE_classifyList="classifyList";
private static final String TABLE_lastWeekList="lastWeekList";
private static final int DB_VERSION=1;
private static timeUseDBHelper timeUseDBHelper=null;
private SQLiteDatabase mRDB=null;
@ -64,22 +68,60 @@ public class timeUseDBHelper extends SQLiteOpenHelper {
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"date VARCHAR NOT NULL,"+
"startTime VARCHAR NOT NULL,"+
"startHour VARCHAR NOT NULL,"+
"startMin VARCHAR NOT NULL,"+
"endTime VARCHAR NOT NULL,"+
"endHour VARCHAR NOT NULL,"+
"endMin VARCHAR NOT NULL,"+
"content VARCHAR NOT NULL,"+
"isFinished INTEGER NOT NULL);";
db.execSQL(sql);
String sql4="CREATE TABLE IF NOT EXISTS "+TABLE_classifyList+
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"appName VARCHAR NOT NULL,"+
"appPacketName VARCHAR NOT NULL,"+
"appClassify VARCHAR NOT NULL);";
db.execSQL(sql4);
String sql3="CREATE TABLE IF NOT EXISTS "+TABLE_appListYesterday+
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"date VARCHAR NOT NULL,"+
"appName VARCHAR NOT NULL,"+
"appPacketName VARCHAR NOT NULL,"+
"appClassify VARCHAR NOT NULL,"+
"appUseTimeLong VARCHAR NOT NULL," +
"appUseTimeString VARCHAR NOT NULL);";
db.execSQL(sql3);
String sql5="CREATE TABLE IF NOT EXISTS "+TABLE_lastWeekList+
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"date VARCHAR NOT NULL,"+
"appName VARCHAR NOT NULL,"+
"appPacketName VARCHAR NOT NULL,"+
"appClassify VARCHAR NOT NULL,"+
"appUseTimeLong VARCHAR NOT NULL," +
"appUseTimeString VARCHAR NOT NULL);";
db.execSQL(sql5);
String sql1="CREATE TABLE IF NOT EXISTS "+TABLE_UserList+
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"userID VARCHAR NOT NULL,"+
"username VARCHAR NOT NULL,"+
"password VARCHAR NOT NULL);";
db.execSQL(sql1);
String sql2="CREATE TABLE IF NOT EXISTS "+TABLE_appList+
"(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+
"date VARCHAR NOT NULL,"+
"appName VARCHAR NOT NULL,"+
"appPacketName VARCHAR NOT NULL,"+
"appClassify VARCHAR NOT NULL,"+
"appUseTimeLong VARCHAR NOT NULL," +
"appUseTimeString VARCHAR NOT NULL);";
db.execSQL(sql2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
// 获取数据库中的任务列表
// 获取数据库中的taskList
public List<taskInfo> queryAllTaskInfo(){
// String sql="select * from "+TABLE_taskList;
List<taskInfo> list=new ArrayList<>();
@ -87,31 +129,218 @@ public class timeUseDBHelper extends SQLiteOpenHelper {
Cursor cursor=mRDB.query(TABLE_taskList,null,null,null,null,null,null);
while(cursor.moveToNext()){
taskInfo task=new taskInfo();
task.id=cursor.getInt(0);
task.startTime=cursor.getString(2);
task.endTime=cursor.getString(3);
task.isFinished=cursor.getInt(5)!=0;
task.content=cursor.getString(4);
task.date=cursor.getString(1);
task.setId(cursor.getInt(0));
task.setStartTime(cursor.getString(2));
task.setStartHour(cursor.getInt(3));
task.setStartMin(cursor.getInt(4));
task.setEndTime(cursor.getString(5));
task.setEndHour(cursor.getInt(6));
task.setEndMin(cursor.getInt(7));
task.setFinished(cursor.getInt(9) != 0);
task.setContent(cursor.getString(8));
task.setDate(cursor.getString(1));
list.add(task);
}
cursor.close();
return list;
}
// 向数据库添加任务信息
// 获取数据库中的appList
public List<AppInfo> queryAllAppInfo(){
// String sql="select * from "+TABLE_taskList;
List<AppInfo> list=new ArrayList<>();
// Cursor cursor=mRDB.rawQuery(sql,null);
Cursor cursor=mRDB.query(TABLE_appList,null,null,null,null,null,null);
while(cursor.moveToNext()){
AppInfo app=new AppInfo();
app.setUid(cursor.getInt(0));
app.setDate(cursor.getString(1));
app.setLabel(cursor.getString(2));
app.setPackage_name(cursor.getString(3));
app.setClassify(cursor.getString(4));
app.setTimeLong(cursor.getLong(5));
app.setTimeString(cursor.getString(6));
list.add(app);
}
cursor.close();
return list;
}
// 获取数据库中的appListYesterday
public List<AppInfo> queryAllAppYesterdayInfo(){
List<AppInfo> list=new ArrayList<>();
Cursor cursor=mRDB.query(TABLE_appListYesterday,null,null,null,null,null,null);
while(cursor.moveToNext()){
AppInfo app=new AppInfo();
app.setUid(cursor.getInt(0));
app.setDate(cursor.getString(1));
app.setLabel(cursor.getString(2));
app.setPackage_name(cursor.getString(3));
app.setClassify(cursor.getString(4));
app.setTimeLong(cursor.getLong(5));
app.setTimeString(cursor.getString(6));
list.add(app);
}
cursor.close();
return list;
}
// 获取数据库中的lastWeekList
public List<AppInfo> queryAllLastWeekInfo(){
List<AppInfo> list=new ArrayList<>();
Cursor cursor=mRDB.query(TABLE_lastWeekList,null,null,null,null,null,null);
while(cursor.moveToNext()){
AppInfo app=new AppInfo();
app.setUid(cursor.getInt(0));
app.setDate(cursor.getString(1));
app.setLabel(cursor.getString(2));
app.setPackage_name(cursor.getString(3));
app.setClassify(cursor.getString(4));
app.setTimeLong(cursor.getLong(5));
app.setTimeString(cursor.getString(6));
list.add(app);
}
cursor.close();
return list;
}
// 取数据库中的classifyList
public List<AppInfo> queryAllClassifyInfo(){
List<AppInfo> list=new ArrayList<>();
Cursor cursor=mRDB.query(TABLE_classifyList,null,null,null,null,null,null);
while(cursor.moveToNext()){
AppInfo app=new AppInfo();
app.setUid(cursor.getInt(0));
app.setLabel(cursor.getString(1));
app.setPackage_name(cursor.getString(2));
app.setClassify(cursor.getString(3));
list.add(app);
}
cursor.close();
return list;
}
// 向taskList添加任务信息
public long insertTaskInfos(taskInfo task){
ContentValues values=new ContentValues();
values.put("date",task.date);
values.put("content",task.content);
values.put("startTime",task.startTime);
values.put("endTime",task.endTime);
values.put("isFinished",task.isFinished);
values.put("date",task.getDate());
values.put("content",task.getContent());
values.put("startTime",task.getStartTime());
values.put("startHour",task.getStartHour());
values.put("startMin",task.getStartMin());
values.put("endTime",task.getEndTime());
values.put("endHour",task.getEndHour());
values.put("endMin",task.getEndMin());
values.put("isFinished",task.isFinished());
return mWDB.insert(TABLE_taskList,null,values);
}
// 删除数据库中的信息
public long deleteTaskInfos(String data){
return mWDB.delete(TABLE_taskList,"content=?",new String[]{data});
// 向classifyList添加任务信息
public long insertClassifyInfos(AppInfo app){
ContentValues values=new ContentValues();
values.put("appName",app.getLabel());
values.put("appClassify","123");
values.put("appPacketName",app.getPackage_name());
return mWDB.insert(TABLE_classifyList,null,values);
}
// 向appList添加任务信息
public long insertAppInfos(AppInfo app,String date) {
ContentValues values=new ContentValues();
values.put("date",date);
values.put("appName",app.getLabel());
values.put("appPacketName",app.getPackage_name());
values.put("appUseTimeLong",app.getTimeLong());
values.put("appUseTimeString",app.getTimeString());
values.put("appClassify",app.getClassify());
// 将appList的数据复制到appListYesterday中
mWDB.insert(TABLE_appListYesterday,null,values);
mWDB.insert(TABLE_lastWeekList,null,values);
return mWDB.insert(TABLE_appList,null,values);
}
// 向appListYesterday添加任务信息
public long insertAppYesrerdayInfos(AppInfo app,String date){
ContentValues values=new ContentValues();
values.put("date",date);
values.put("appName",app.getLabel());
values.put("appPacketName",app.getPackage_name());
values.put("appUseTimeLong",app.getTimeLong());
values.put("appUseTimeString",app.getTimeString());
values.put("appClassify",app.getClassify());
// 将appList的数据复制到appListYesterday中
return mWDB.insert(TABLE_appListYesterday,null,values);
}
// 向lastWeekList添加任务信息
public long insertLastWeekInfos(AppInfo app,String date){
ContentValues values=new ContentValues();
values.put("date",date);
values.put("appName",app.getLabel());
values.put("appPacketName",app.getPackage_name());
values.put("appUseTimeLong",app.getTimeLong());
values.put("appUseTimeString",app.getTimeString());
values.put("appClassify",app.getClassify());
// 将appList的数据复制到appListYesterday中
return mWDB.insert(TABLE_lastWeekList,null,values);
}
public long insertUserInfos(String a,String b,String c){
ContentValues values=new ContentValues();
values.put("userID",a);
values.put("username",b);
values.put("password",c);
return mWDB.insert("UserList",null,values);
}
// 查找相同包名
public Boolean searchPacketName(String pn,String database){
int flag=0;
Cursor cursor=mRDB.query(database,null,null,null,null,null,null);
while(cursor.moveToNext()){
if(pn.equals(cursor.getString(3))){
flag=1;
break;
}
}
cursor.close();
return flag==1;
}
// 查找应用分类
public String searchClassify(String pn){
String c="";
Cursor cursor=mRDB.query(TABLE_appList,null,null,null,null,null,null);
while(cursor.moveToNext()){
if(pn.equals(cursor.getString(3))){
c=cursor.getString(4);
break;
}
}
cursor.close();
return c;
}
// 更新appList中的应用使用时间
public long updateAppUseTime(AppInfo app,String date){
ContentValues values=new ContentValues();
values.put("appUseTimeLong",app.getTimeLong());
values.put("appUseTimeString",app.getTimeString());
values.put("date",date);
return mWDB.update(TABLE_appList,values,"appPacketName=?",new String[]{app.getPackage_name()});
}
public long updateAppClassify(AppInfo app){
mWDB=timeUseDBHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("appClassify",app.getClassify());
return mWDB.update(TABLE_classifyList,values,"appPacketName=?",new String[]{app.getPackage_name()});
}
// 清空所有应用使用数据
public void clearAppUseTime(String date){
ContentValues values=new ContentValues();
values.put("appUseTimeLong",0);
values.put("appUseTimeString","null");
values.put("date","null");
mWDB.update(TABLE_appList,values,"date=?",new String[]{date});
}
public void deleteAppYesterdayInfos(String date){
mWDB.delete(TABLE_appListYesterday,"date=?",new String[]{date});
}
public void deleteLastWeekListInfos(String date){
mWDB.delete(TABLE_lastWeekList,"date=?",new String[]{date});
}
}

@ -61,6 +61,6 @@ public class reportFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_report, container, false);
return inflater.inflate(R.layout.fragment_today, container, false);
}
}

@ -0,0 +1,257 @@
package com.tanshui.timeuse.fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.tanshui.timeuse.AppInfo;
import com.tanshui.timeuse.PieInfo;
import com.tanshui.timeuse.R;
import com.tanshui.timeuse.database.timeUseDBHelper;
import com.tanshui.timeuse.taskInfo;
import com.tanshui.timeuse.util.PieChart;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class today extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_today, container, false);
List<PieInfo> pieInfoList=new ArrayList<>();
List<AppInfo> appInfoList;
List<taskInfo> taskInfoList;
timeUseDBHelper dbHepler;
TextView btn1=view.findViewById(R.id.pie_btn1);
TextView btn2=view.findViewById(R.id.pie_btn2);
TextView btn3=view.findViewById(R.id.pie_btn3);
TextView btn4=view.findViewById(R.id.pie_btn4);
TextView btn5=view.findViewById(R.id.pie_btn5);
TextView btn6=view.findViewById(R.id.pie_btn6);
TextView t=view.findViewById(R.id.top_five);
TextView taskNumber=view.findViewById(R.id.taskNumber);
TextView taskNumRate=view.findViewById(R.id.taskNumRate);
TextView finishRate=view.findViewById(R.id.finishRate);
PieChart pie_chart1=view.findViewById(R.id.pie_chart1);
dbHepler = timeUseDBHelper.getInstance(view.getContext());
dbHepler.openReadLink();
appInfoList=dbHepler.queryAllAppInfo();
taskInfoList=dbHepler.queryAllTaskInfo();
// 获取今天和昨天日期
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(System.currentTimeMillis()-1000*60*60*24);
String yes=formatter.format(date);
date = new Date(System.currentTimeMillis());
String today=formatter.format(date);
int todayFinishedNum=0;
int todayNum=0;
for(taskInfo task:taskInfoList){
// Toast.makeText(view.getContext(), task.isFinished+"", Toast.LENGTH_SHORT).show();
if(task.getDate().equals(today)){
todayNum++;
if(task.isFinished())
todayFinishedNum++;
}
}
NumberFormat percentInstance = NumberFormat.getPercentInstance();
percentInstance.setMinimumFractionDigits(2);
taskNumber.setText("今天任务数量:"+todayNum);
int yesNum=0;
int yesFinishedNum=0;
for(taskInfo task:taskInfoList){
if(task.getDate().equals(yes)){
yesNum++;
if(task.isFinished())
yesFinishedNum++;
}
}
if(todayFinishedNum>0){
finishRate.setText("今天任务完成率:"+percentInstance.format((float)todayFinishedNum/todayNum));
if(yesFinishedNum>0){
if((float)todayFinishedNum/todayNum>(float)yesFinishedNum/yesNum)
taskNumRate.setText("与昨天相比,任务完成率增长了"+percentInstance.format((float)(todayFinishedNum/todayNum)-(yesFinishedNum/yesNum)));
else
taskNumRate.setText("与昨天相比,任务完成率降低了"+percentInstance.format((float)(yesFinishedNum/yesNum)-(todayFinishedNum/todayNum)));
}else{
taskNumRate.setText("与昨天相比,任务完成率增长了"+percentInstance.format((float)todayFinishedNum/todayNum));
}
}else{
finishRate.setText("今天任务完成率0%");
if(yesFinishedNum>0)
taskNumRate.setText("与昨天相比,任务完成率降低了");
else
taskNumRate.setText("今天和昨天都没有完成任务哦");
}
long totalTime=0;
List<AppInfo> topFive=new ArrayList<>();
// 获得使用时间最长的前五个应用
for(int i=0;i<appInfoList.size();i++){
if(i<5){
topFive.add(appInfoList.get(i));
}else{
long min=topFive.get(0).getTimeLong();
int index=0;
for(int j=1;j<topFive.size();j++){
if(min>topFive.get(j).getTimeLong()){
min=topFive.get(j).getTimeLong();
index=j;
}
}
if(appInfoList.get(i).getTimeLong()>min){
topFive.remove(index);
topFive.add(appInfoList.get(i));
}
}
}
for(AppInfo app:appInfoList){
totalTime+=app.getTimeLong();
}
// percentInstance.format((float)topFive.get(1).timeLong/totalTime)
btn1.setText(topFive.get(0).getLabel()+" "+getTimeFromInt(topFive.get(0).getTimeLong()));
btn2.setText(topFive.get(1).getLabel()+" "+getTimeFromInt(topFive.get(1).getTimeLong()));
btn3.setText(topFive.get(2).getLabel()+" "+getTimeFromInt(topFive.get(2).getTimeLong()));
btn4.setText(topFive.get(3).getLabel()+" "+getTimeFromInt(topFive.get(3).getTimeLong()));
btn5.setText(topFive.get(4).getLabel()+" "+getTimeFromInt(topFive.get(4).getTimeLong()));
btn6.setText("其他 "+getTimeFromInt((totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())));
btn1.setTextColor(Color.parseColor("#FFA500"));
btn2.setTextColor(Color.parseColor("#33FF00"));
btn3.setTextColor(Color.parseColor("#0033FF"));
btn4.setTextColor(Color.parseColor("#9B30FF"));
btn5.setTextColor(Color.parseColor("#EE3B3B"));
btn6.setTextColor(Color.parseColor("#FFA07A"));
// 随机颜色
// ColorRandom colorRandom1 = new ColorRandom(10);
// for (int i = 0; i < 5; i++) {
// int colors = (int) colorRandom1.getColors().get(i);
// pieInfoList.add(new PieInfo(colors, (float)topFive.get(i).timeLong/totalTime));
//
// }
pieInfoList.add(new PieInfo(Color.parseColor("#FFA500"), (float)topFive.get(0).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#33FF00"), (float)topFive.get(1).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#0033FF"), (float)topFive.get(2).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#9B30FF"), (float)topFive.get(3).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#FFA07A"), (float)(totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/totalTime));
// pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).timeLong/totalTime));
pie_chart1.setData(pieInfoList);
// 开始绘制饼状图
pie_chart1.startAnima();
long finalTotalTime = totalTime;
btn1.setOnClickListener(v -> {
if (pieInfoList.get(0).isSelected()) {
pieInfoList.get(0).setSelected(false);
btn1.setText(topFive.get(0).getLabel()+" "+getTimeFromInt(topFive.get(0).getTimeLong()));
} else {
pieInfoList.get(0).setSelected(true);
btn1.setText(topFive.get(0).getLabel()+" "+percentInstance.format((float)topFive.get(0).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn2.setOnClickListener(v -> {
if (pieInfoList.get(1).isSelected()) {
pieInfoList.get(1).setSelected(false);
btn2.setText(topFive.get(1).getLabel()+" "+getTimeFromInt(topFive.get(1).getTimeLong()));
} else {
pieInfoList.get(1).setSelected(true);
btn2.setText(topFive.get(1).getLabel()+" "+percentInstance.format((float)topFive.get(1).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn3.setOnClickListener(v -> {
if (pieInfoList.get(2).isSelected()) {
pieInfoList.get(2).setSelected(false);
btn3.setText(topFive.get(2).getLabel()+" "+getTimeFromInt(topFive.get(2).getTimeLong()));
} else {
pieInfoList.get(2).setSelected(true);
btn3.setText(topFive.get(2).getLabel()+" "+percentInstance.format((float)topFive.get(3).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn4.setOnClickListener(v -> {
if (pieInfoList.get(3).isSelected()) {
pieInfoList.get(3).setSelected(false);
btn4.setText(topFive.get(3).getLabel()+" "+getTimeFromInt(topFive.get(3).getTimeLong()));
} else {
pieInfoList.get(3).setSelected(true);
btn4.setText(topFive.get(3).getLabel()+" "+percentInstance.format((float)topFive.get(3).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn5.setOnClickListener(v -> {
if (pieInfoList.get(4).isSelected()) {
pieInfoList.get(4).setSelected(false);
btn5.setText(topFive.get(4).getLabel()+" "+getTimeFromInt(topFive.get(4).getTimeLong()));
} else {
pieInfoList.get(4).setSelected(true);
btn5.setText(topFive.get(4).getLabel()+" "+percentInstance.format((float)topFive.get(4).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn6.setOnClickListener(v -> {
if (pieInfoList.get(5).isSelected()) {
pieInfoList.get(5).setSelected(false);
btn6.setText("其他 "+getTimeFromInt((finalTotalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())));
} else {
pieInfoList.get(5).setSelected(true);
btn6.setText("其他 "+percentInstance.format((float)(finalTotalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
return view;
}
public static String getTimeFromInt(long time) {
if (time <= 0) { return "已结束"; }
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
return hour+"小时"+minute+"分钟"+second+"秒";
}
}

@ -0,0 +1,479 @@
package com.tanshui.timeuse.fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.tanshui.timeuse.AppInfo;
import com.tanshui.timeuse.PieInfo;
import com.tanshui.timeuse.R;
import com.tanshui.timeuse.database.timeUseDBHelper;
import com.tanshui.timeuse.taskInfo;
import com.tanshui.timeuse.util.PieChart;
import com.tanshui.timeuse.util.dateList;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class week extends Fragment{
private timeUseDBHelper dbHepler;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_week, container, false);
TextView btn1=view.findViewById(R.id.week_pie_btn1);
TextView btn2=view.findViewById(R.id.week_pie_btn2);
TextView btn3=view.findViewById(R.id.week_pie_btn3);
TextView btn4=view.findViewById(R.id.week_pie_btn4);
TextView btn5=view.findViewById(R.id.week_pie_btn5);
TextView btn6=view.findViewById(R.id.week_pie_btn6);
TextView btn_fun=view.findViewById(R.id.week_pie_btn21);
TextView btn_study=view.findViewById(R.id.week_pie_btn22);
TextView btn_life=view.findViewById(R.id.week_pie_btn23);
TextView taskNumber=view.findViewById(R.id.week_taskNumber);
TextView finishRate=view.findViewById(R.id.week_finishRate);
TextView top_finishRate=view.findViewById(R.id.week_topFinishRate);
TextView top_taskNumber=view.findViewById(R.id.week_topTaskNumber);
PieChart pie_chart1=view.findViewById(R.id.week_pie_chart1);
PieChart pie_chart2=view.findViewById(R.id.week_pie_chart2);
List<PieInfo> pieInfoList=new ArrayList<>();
List<PieInfo> pieInfoList1=new ArrayList<>();
List<AppInfo> appInfoList;
List<taskInfo> taskInfoList;
List<taskInfo> taskInfoListWeek=new ArrayList<>();
dbHepler = timeUseDBHelper.getInstance(view.getContext());
dbHepler.openReadLink();
appInfoList=dbHepler.queryAllLastWeekInfo();
taskInfoList=dbHepler.queryAllTaskInfo();
// 折线图
LineChart line;
LineChart line1;
// 获取今天和昨天日期
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(System.currentTimeMillis()-1000*60*60*24);
String yes=formatter.format(date);
// date = new Date(System.currentTimeMillis());
// String today=formatter.format(date);
int todayNum=0;
int todayFinishedNum=0;
NumberFormat percentInstance = NumberFormat.getPercentInstance();
percentInstance.setMinimumFractionDigits(2);
for(taskInfo task:taskInfoList){
Date d=null;
try {
d=formatter.parse(task.getDate());
} catch (ParseException e) {
e.printStackTrace();
}
assert d != null;
if((System.currentTimeMillis()- d.getTime())<=7*1000*60*60*24){
todayNum++;
taskInfoListWeek.add(task);
if(task.isFinished())
todayFinishedNum++;
}
}
HashMap<String,Integer> hashMap=new HashMap<>();
HashMap<String,Float> hashMap1=new HashMap<>();
for(int i=0;i<taskInfoListWeek.size();i++){
float num=1;
float fNum=0;
for(int j=i+1;j<taskInfoListWeek.size();j++){
if(taskInfoListWeek.get(i).getDate().equals(taskInfoListWeek.get(j).getDate()))
num++;
if(taskInfoListWeek.get(i).isFinished())
fNum++;
hashMap.put(taskInfoListWeek.get(j).getDate(),(int)num);
if(fNum!=0)
hashMap1.put(taskInfoListWeek.get(j).getDate(),(fNum/num));
else
hashMap1.put(taskInfoListWeek.get(j).getDate(),0.0f);
}
}
taskNumber.setText("最近一周任务数量:"+todayNum);
int max=0;
float max1=0;
for(int n:hashMap.values()){
max=Math.max(max,n);
}
for(float n:hashMap1.values()){
max1=Math.max(max1,n);
}
List<String> result=new ArrayList<>();
List<String> result1=new ArrayList<>();
Set<Map.Entry<String, Integer>> set = hashMap.entrySet();
Set<Map.Entry<String, Float>> set1 = hashMap1.entrySet();
for(Map.Entry<String, Integer> entry : set){
if(entry.getValue()==max){
result.add(entry.getKey());
}
}
for(Map.Entry<String, Float> entry : set1){
if(entry.getValue()==max1){
result1.add(entry.getKey());
}
}
StringBuilder s1= new StringBuilder("任务设置最多的天数是:");
StringBuilder s2= new StringBuilder("任务完成率最高的天数是:");
if(result.size()>1){
for(int i=0;i<result.size();i++) {
if(i<result.size()-1)
s1.append(result.get(i)).append("和");
else s1.append(result.get(i));
}
}else if(result.size()>0){
s1.append(result.get(0));
}
if(result1.size()>1){
for(int i=0;i<result1.size();i++) {
if(i<result1.size()-1)
s2.append(result1.get(i)).append("和");
else s2.append(result1.get(i));
}
}else if(result1.size()>0){
s2.append(result1.get(0));
}
if(result.size()!=0&&result1.size()!=0){
top_taskNumber.setText(s1+",设置了"+hashMap.get(result.get(0))+"个任务");
top_finishRate.setText(s2+",完成率为:"+percentInstance.format(hashMap1.get(result.get(0))));
}else if(result.size()==0&&result1.size()!=0){
top_taskNumber.setText("123");
top_finishRate.setText(s2+",完成率为:"+percentInstance.format(hashMap1.get(result.get(0))));
}else if(result1.size()==0&&result.size()!=0){
top_finishRate.setText("12344");
top_taskNumber.setText(s1+",设置了"+hashMap.get(result.get(0))+"个任务");
}else{
top_finishRate.setText("12345");
top_taskNumber.setText("12345");
}
int yesNum=0;
int yesFinishedNum=0;
for(taskInfo task:taskInfoList){
if(task.getDate().equals(yes)){
yesNum++;
if(task.isFinished())
yesFinishedNum++;
}
}
if(todayNum!=0)
finishRate.setText("任务完成率:"+percentInstance.format((float)todayFinishedNum/todayNum));
else finishRate.setText("任务完成率0%");
long totalTime=0;
List<AppInfo> topFive=new ArrayList<>();
// 获得使用时间最长的前五个应用
for(int i=0;i<appInfoList.size();i++){
if(i<5){
topFive.add(appInfoList.get(i));
}else{
long min=topFive.get(0).getTimeLong();
int index=0;
for(int j=1;j<topFive.size();j++){
if(min>topFive.get(j).getTimeLong()){
min=topFive.get(j).getTimeLong();
index=j;
}
}
if(appInfoList.get(i).getTimeLong()>min){
topFive.remove(index);
topFive.add(appInfoList.get(i));
}
}
}
for(AppInfo app:appInfoList){
totalTime+=app.getTimeLong();
}
btn1.setText(topFive.get(0).getLabel()+" "+percentInstance.format((float)topFive.get(0).getTimeLong()/totalTime));
btn2.setText(topFive.get(1).getLabel()+" "+percentInstance.format((float)topFive.get(1).getTimeLong()/totalTime));
btn3.setText(topFive.get(2).getLabel()+" "+percentInstance.format((float)topFive.get(2).getTimeLong()/totalTime));
btn4.setText(topFive.get(3).getLabel()+" "+percentInstance.format((float)topFive.get(3).getTimeLong()/totalTime));
btn5.setText(topFive.get(4).getLabel()+" "+percentInstance.format((float)topFive.get(4).getTimeLong()/totalTime));
btn6.setText("其他 "+percentInstance.format((float)(totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/totalTime));
btn1.setTextColor(Color.parseColor("#FFA500"));
btn2.setTextColor(Color.parseColor("#33FF00"));
btn3.setTextColor(Color.parseColor("#0033FF"));
btn4.setTextColor(Color.parseColor("#9B30FF"));
btn5.setTextColor(Color.parseColor("#EE3B3B"));
btn6.setTextColor(Color.parseColor("#FFA07A"));
// 随机颜色
// ColorRandom colorRandom1 = new ColorRandom(10);
// for (int i = 0; i < 5; i++) {
// int colors = (int) colorRandom1.getColors().get(i);
// pieInfoList.add(new PieInfo(colors, (float)topFive.get(i).timeLong/totalTime));
//
// }
pieInfoList.add(new PieInfo(Color.parseColor("#FFA500"), (float)topFive.get(0).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#33FF00"), (float)topFive.get(1).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#0033FF"), (float)topFive.get(2).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#9B30FF"), (float)topFive.get(3).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#FFA07A"), (float)(totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/totalTime));
// pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).timeLong/totalTime));
pie_chart1.setData(pieInfoList);
// 开始绘制饼状图
pie_chart1.startAnima();
// 折线图
//②findViewById方法获取到布局文件中的元素
line = view.findViewById(R.id.line);
line1 = view.findViewById(R.id.line1);
//③line Style
// background color
line.setBackgroundColor(Color.WHITE);
line1.setBackgroundColor(Color.WHITE);
// disable description text
line.getDescription().setEnabled(false);
line1.getDescription().setEnabled(false);
// enable touch gestures
line.setTouchEnabled(true);
line1.setTouchEnabled(true);
// enable scaling and dragging
line.setDragEnabled(true);
line.setScaleEnabled(true);
line1.setDragEnabled(true);
line1.setScaleEnabled(true);
// line.setScaleXEnabled(true);
// line.setScaleYEnabled(true);
// force pinch zoom along both axis
line.setPinchZoom(true);
line1.setPinchZoom(true);
List<dateList> dateLists=new ArrayList<>();
for(int i=6;i>=0;i--){
dateList d=new dateList();
Date date1=new Date(System.currentTimeMillis()- 1000L *60*60*24*i);
int num=0;
int finishedNum=0;
String month=(date1.getMonth()+1)<10?"0"+(date1.getMonth()+1):(date1.getMonth()+1)+"";
String day=date1.getDate()<10?"0"+date1.getDate():date1.getDate()+"";
String date_String=month+"."+day+"f";
d.setDates((float) (Math.round(Float.parseFloat(date_String) * 100)) / 100);
for(taskInfo task:taskInfoList){
if(formatter.format(date1).equals(task.getDate())){
num=0;
for(taskInfo tasks:taskInfoList){
if(tasks.getDate().equals(task.getDate())){
num++;
if(tasks.isFinished())
finishedNum++;
}
}
break;
}
}
d.setNum(num);
d.setFinishedNum(finishedNum);
dateLists.add(d);
}
//实例化一个 List 用来保存折线图的数据
List<Entry> list=new ArrayList<>();
List<Entry> list1=new ArrayList<>();
DecimalFormat dec = new DecimalFormat("0.00");
//④导入数据
//其中两个数字对应的分别是 X轴Y轴
for(dateList datee:dateLists){
float rate=0;
if(datee.getNum()!=0)
rate=(float)datee.getFinishedNum()/datee.getNum()*100;
list.add(new Entry(datee.getDates() ,datee.getNum()));
list1.add(new Entry(datee.getDates(),rate));
}
// list1.add(new Entry(11.11f, 2));
// list1.add(new Entry(11.12f,1.0f));
// list1.add(new Entry(11.13f,1.4f));
// list1.add(new Entry(11.14f,1.2f));
//⑤实例化Dataset
//list是你这条线的数据 "android" 是你对这条线的描述(也就是图例上的文字)
LineDataSet lineDataSet=new LineDataSet(list,"任务量");
LineDataSet lineDataSet1=new LineDataSet(list1,"任务完成率(%)");
lineDataSet1.setColor(Color.parseColor("#FFA500"));
lineDataSet1.setCircleColor(Color.parseColor("#FFA500"));
LineData lineData=new LineData(lineDataSet);
//有多条数据则使用addDataSet()方法 参数是你的DataSet
LineData lineData1=new LineData(lineDataSet1);
line.setData(lineData);
line1.setData(lineData1);
btn1.setOnClickListener(v -> {
if (pieInfoList.get(0).isSelected()) {
pieInfoList.get(0).setSelected(false);
} else {
pieInfoList.get(0).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn2.setOnClickListener(v -> {
if (pieInfoList.get(1).isSelected()) {
pieInfoList.get(1).setSelected(false);
} else {
pieInfoList.get(1).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn3.setOnClickListener(v -> {
if (pieInfoList.get(2).isSelected()) {
pieInfoList.get(2).setSelected(false);
} else {
pieInfoList.get(2).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn4.setOnClickListener(v -> {
if (pieInfoList.get(3).isSelected()) {
pieInfoList.get(3).setSelected(false);
} else {
pieInfoList.get(3).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn5.setOnClickListener(v -> {
if (pieInfoList.get(4).isSelected()) {
pieInfoList.get(4).setSelected(false);
} else {
pieInfoList.get(4).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn6.setOnClickListener(v -> {
if (pieInfoList.get(5).isSelected()) {
pieInfoList.get(5).setSelected(false);
} else {
pieInfoList.get(5).setSelected(true);
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
List <AppInfo> classify=new ArrayList<>();
long fun=0,study=0,life=0;
for(AppInfo app:appInfoList){
if(app.getClassify().equals("娱乐"))
fun+=app.getTimeLong();
else if(app.getClassify().equals("学习"))
study+=app.getTimeLong();
else if(app.getClassify().equals("生活"))
life+=app.getTimeLong();
}
btn_fun.setText("娱乐类");
btn_life.setText("生活类");
btn_study.setText("学习类");
btn_fun.setTextColor(Color.parseColor("#FFA500"));
btn_study.setTextColor(Color.parseColor("#EE3B3B"));
btn_life.setTextColor(Color.parseColor("#0033FF"));
btn_fun.setOnClickListener(v -> {
if (pieInfoList1.get(0).isSelected()) {
pieInfoList1.get(0).setSelected(false);
} else {
pieInfoList1.get(0).setSelected(true);
}
pie_chart2.setData(pieInfoList1);
// 不执行动画
pie_chart2.invalidate();
});
btn_study.setOnClickListener(v -> {
if (pieInfoList1.get(1).isSelected()) {
pieInfoList1.get(1).setSelected(false);
} else {
pieInfoList1.get(1).setSelected(true);
}
pie_chart2.setData(pieInfoList1);
// 不执行动画
pie_chart2.invalidate();
});
btn_life.setOnClickListener(v -> {
if (pieInfoList1.get(2).isSelected()) {
pieInfoList1.get(2).setSelected(false);
} else {
pieInfoList1.get(2).setSelected(true);
}
pie_chart2.setData(pieInfoList1);
// 不执行动画
pie_chart2.invalidate();
});
pieInfoList1.add(new PieInfo(Color.parseColor("#FFA500"), (float)fun/(fun+study+life)));
pieInfoList1.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)study/(fun+study+life)));
pieInfoList1.add(new PieInfo(Color.parseColor("#0033FF"), (float)life/(fun+study+life)));
pie_chart2.setData(pieInfoList1);
// 开始绘制饼状图
pie_chart2.startAnima();
return view;
}
// public static float getTimeFromInt(long time) {
//
//
//// long day = time / (1 * 60 * 60 * 24);
// long hour = time / (1000*60*60*24) % 60 ;
// String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
// String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
//
// return hour+"小时"+minute+"分钟"+second+"秒";
//
// }
}

@ -0,0 +1,223 @@
package com.tanshui.timeuse.fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.tanshui.timeuse.AppInfo;
import com.tanshui.timeuse.PieInfo;
import com.tanshui.timeuse.R;
import com.tanshui.timeuse.database.timeUseDBHelper;
import com.tanshui.timeuse.taskInfo;
import com.tanshui.timeuse.util.PieChart;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class yesterday extends Fragment {
private timeUseDBHelper dbHelper;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_yesterday, container, false);
List<PieInfo> pieInfoList=new ArrayList<>();
List<AppInfo> appInfoList;
List<taskInfo> taskInfoList;
dbHelper = timeUseDBHelper.getInstance(view.getContext());
dbHelper.openReadLink();
appInfoList=dbHelper.queryAllAppYesterdayInfo();
taskInfoList=dbHelper.queryAllTaskInfo();
TextView btn1=view.findViewById(R.id.pie_yesterday_btn1);
TextView btn2=view.findViewById(R.id.pie_yesterday_btn2);
TextView btn3=view.findViewById(R.id.pie_yesterday_btn3);
TextView btn4=view.findViewById(R.id.pie_yesterday_btn4);
TextView btn5=view.findViewById(R.id.pie_yesterday_btn5);
TextView btn6=view.findViewById(R.id.pie_yesterday_btn6);
TextView taskNumber=view.findViewById(R.id.taskNumber_yesterday);
TextView finishRate=view.findViewById(R.id.finishRate_yesterday);
PieChart pie_chart1=view.findViewById(R.id.pie_chart2);
// 获取今天和昨天日期
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date(System.currentTimeMillis()-1000*60*60*24);
String yes=formatter.format(date);
NumberFormat percentInstance = NumberFormat.getPercentInstance();
percentInstance.setMinimumFractionDigits(2);
int yesNum=0;
int yesFinishedNum=0;
for(taskInfo task:taskInfoList){
if(task.getDate().equals(yes)){
yesNum++;
if(task.isFinished())
yesFinishedNum++;
}
}
taskNumber.setText("昨日任务数量:"+yesNum);
if(yesFinishedNum>0)
finishRate.setText("昨日任务完成率:"+percentInstance.format((float)yesFinishedNum/yesNum));
else
finishRate.setText("昨日任务完成率0%");
long totalTime=0;
List<AppInfo> topFive=new ArrayList<>();
// 获得使用时间最长的前五个应用
for(int i=0;i<appInfoList.size();i++){
if(i<5){
topFive.add(appInfoList.get(i));
}else{
long min=topFive.get(0).getTimeLong();
int index=0;
for(int j=1;j<topFive.size();j++){
if(min>topFive.get(j).getTimeLong()){
min=topFive.get(j).getTimeLong();
index=j;
}
}
if(appInfoList.get(i).getTimeLong()>min){
topFive.remove(index);
topFive.add(appInfoList.get(i));
}
}
}
for(AppInfo app:appInfoList){
totalTime+=app.getTimeLong();
}
btn1.setText(topFive.get(0).getLabel()+" "+getTimeFromInt(topFive.get(0).getTimeLong()));
btn2.setText(topFive.get(1).getLabel()+" "+getTimeFromInt(topFive.get(1).getTimeLong()));
btn3.setText(topFive.get(2).getLabel()+" "+getTimeFromInt(topFive.get(2).getTimeLong()));
btn4.setText(topFive.get(3).getLabel()+" "+getTimeFromInt(topFive.get(3).getTimeLong()));
btn5.setText(topFive.get(4).getLabel()+" "+getTimeFromInt(topFive.get(4).getTimeLong()));
btn6.setText("其他 "+getTimeFromInt((totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())));
btn1.setTextColor(Color.parseColor("#FFA500"));
btn2.setTextColor(Color.parseColor("#33FF00"));
btn3.setTextColor(Color.parseColor("#0033FF"));
btn4.setTextColor(Color.parseColor("#9B30FF"));
btn5.setTextColor(Color.parseColor("#EE3B3B"));
btn6.setTextColor(Color.parseColor("#FFA07A"));
// 随机颜色
// ColorRandom colorRandom1 = new ColorRandom(10);
// for (int i = 0; i < 5; i++) {
// int colors = (int) colorRandom1.getColors().get(i);
// pieInfoList.add(new PieInfo(colors, (float)topFive.get(i).timeLong/totalTime));
//
// }
pieInfoList.add(new PieInfo(Color.parseColor("#FFA500"), (float)topFive.get(0).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#33FF00"), (float)topFive.get(1).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#0033FF"), (float)topFive.get(2).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#9B30FF"), (float)topFive.get(3).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).getTimeLong()/totalTime));
pieInfoList.add(new PieInfo(Color.parseColor("#FFA07A"), (float)(totalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/totalTime));
// pieInfoList.add(new PieInfo(Color.parseColor("#EE3B3B"), (float)topFive.get(4).timeLong/totalTime));
pie_chart1.setData(pieInfoList);
// 开始绘制饼状图
pie_chart1.startAnima();
long finalTotalTime = totalTime;
btn1.setOnClickListener(v -> {
if (pieInfoList.get(0).isSelected()) {
pieInfoList.get(0).setSelected(false);
btn1.setText(topFive.get(0).getLabel()+" "+getTimeFromInt(topFive.get(0).getTimeLong()));
} else {
pieInfoList.get(0).setSelected(true);
btn1.setText(topFive.get(0).getLabel()+" "+percentInstance.format((float)topFive.get(0).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn2.setOnClickListener(v -> {
if (pieInfoList.get(1).isSelected()) {
pieInfoList.get(1).setSelected(false);
btn2.setText(topFive.get(1).getLabel()+" "+getTimeFromInt(topFive.get(1).getTimeLong()));
} else {
pieInfoList.get(1).setSelected(true);
btn2.setText(topFive.get(1).getLabel()+" "+percentInstance.format((float)topFive.get(1).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn3.setOnClickListener(v -> {
if (pieInfoList.get(2).isSelected()) {
pieInfoList.get(2).setSelected(false);
btn3.setText(topFive.get(2).getLabel()+" "+getTimeFromInt(topFive.get(2).getTimeLong()));
} else {
pieInfoList.get(2).setSelected(true);
btn3.setText(topFive.get(2).getLabel()+" "+percentInstance.format((float)topFive.get(2).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn4.setOnClickListener(v -> {
if (pieInfoList.get(3).isSelected()) {
pieInfoList.get(3).setSelected(false);
btn4.setText(topFive.get(3).getLabel()+" "+getTimeFromInt(topFive.get(3).getTimeLong()));
} else {
pieInfoList.get(3).setSelected(true);
btn4.setText(topFive.get(3).getLabel()+" "+percentInstance.format((float)topFive.get(3).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn5.setOnClickListener(v -> {
if (pieInfoList.get(4).isSelected()) {
pieInfoList.get(4).setSelected(false);
btn5.setText(topFive.get(4).getLabel()+" "+getTimeFromInt(topFive.get(4).getTimeLong()));
} else {
pieInfoList.get(4).setSelected(true);
btn5.setText(topFive.get(4).getLabel()+" "+percentInstance.format((float)topFive.get(4).getTimeLong()/ finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
btn6.setOnClickListener(v -> {
if (pieInfoList.get(5).isSelected()) {
pieInfoList.get(5).setSelected(true);
btn6.setText("其他 "+getTimeFromInt((finalTotalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())));
} else {
pieInfoList.get(5).setSelected(true);
btn6.setText("其他 "+percentInstance.format((float)(finalTotalTime-topFive.get(0).getTimeLong()-topFive.get(1).getTimeLong()-topFive.get(2).getTimeLong()-
topFive.get(3).getTimeLong()-topFive.get(4).getTimeLong())/finalTotalTime));
}
pie_chart1.setData(pieInfoList);
// 不执行动画
pie_chart1.invalidate();
});
return view;
}
public static String getTimeFromInt(long time) {
if (time <= 0) { return "已结束"; }
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
return hour+"小时"+minute+"分钟"+second+"秒";
}
}

@ -1,16 +0,0 @@
package com.tanshui.timeuse.login;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.tanshui.timeuse.R;
public class login extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
}

@ -1,16 +0,0 @@
package com.tanshui.timeuse.login;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.tanshui.timeuse.R;
public class registered extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registered);
}
}

@ -1,44 +1,412 @@
package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.app.ProgressDialog;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.tanshui.timeuse.database.timeUseDBHelper;
import com.tanshui.timeuse.fragment.today;
import com.tanshui.timeuse.fragment.week;
import com.tanshui.timeuse.fragment.yesterday;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class report extends AppCompatActivity {
private TextView title;
private Button jump_appUse;
private Button jump_list;
private Button jump_report;
private timeUseDBHelper dbHelper;
//声明Tab的布局文件
private LinearLayout mTabYesterday;
private LinearLayout mTabToday;
private LinearLayout mTabLastWeek;
//声明Tab的Button
private Button btn_yesterday;
private Button btn_today;
private Button btn_lastWeek;
//声明Tab分别对应的Fragment
private Fragment mFragYesterday;
private Fragment mFragToday;
private Fragment mFragLastWeek;
private List<PieInfo> pieInfoList=new ArrayList<>();
private ArrayList<AppInfo> mApplicationInfos;
private ProgressDialog progressDialog;
private String date;
private String today1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_report);
title=findViewById(R.id.title);
Button jump_appUse;
Button jump_list;
View jump_appClassify;
List<AppInfo> appInfoList;
dbHelper=timeUseDBHelper.getInstance(this);
dbHelper.openReadLink();
Intent intent=getIntent();
// 接受传的今天日期
today1=intent.getStringExtra("date");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd" );
Date yesterday1 = null;
try {
yesterday1 = simpleDateFormat.parse(today1);
} catch (ParseException e) {
e.printStackTrace();
}
assert yesterday1 != null;
long dateLong = yesterday1.getTime();
dateLong=dateLong-1000*60*60*24;
// 转变为昨天日期
date=simpleDateFormat.format(dateLong);
mApplicationInfos =getAllAppInfo(this);
// Calendar now=Calendar.getInstance();
// nowYear =now.get(Calendar.YEAR);
// nowMonth =now.get(Calendar.MONTH)+1;//实际月份需要加1
// nowDay =now.get(Calendar.DATE)-1;
// date =String.format("%s-%s-%s", nowYear, nowMonth, nowDay);
jump_appUse = findViewById(R.id.jump_appUse2);
jump_list=findViewById(R.id.jump_list2);
jump_report=findViewById(R.id.jump_report2);
jump_appClassify =findViewById(R.id.jump_appClassify2);
// XmlPullParser parser = report.this.getResources().getXml(R.layout.taskitem);
// AttributeSet attributes = Xml.asAttributeSet(parser);
// pie pie_chart=new pie(report.this);
// pie_chart.drawPieChart();
jump_appUse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(report.this,appTimeUse.class);
startActivity(intent);
appInfoList=dbHelper.queryAllAppYesterdayInfo();
if(!appInfoList.get(0).getDate().equals(date)){
dbHelper.deleteAppYesterdayInfos(appInfoList.get(0).getDate());
dbHelper.deleteLastWeekListInfos(appInfoList.get(0).getDate());
// 获取今天0点时间
Calendar todayTime0 = Calendar.getInstance();
todayTime0.setTime(new Date());
todayTime0.set(Calendar.HOUR_OF_DAY, 0);
todayTime0.set(Calendar.MINUTE, 0);
todayTime0.set(Calendar.SECOND, 0);
// todayTime0.set(todayTime0.get(Calendar.YEAR), todayTime0.get(Calendar.MONTH), todayTime0.get(Calendar.DAY_OF_MONTH),
// 0, 0, 0);
long today=todayTime0.getTimeInMillis();
todayTime0.set(Calendar.DAY_OF_MONTH,todayTime0.get(Calendar.DAY_OF_MONTH)-1);
long yesterday=todayTime0.getTimeInMillis();
todayTime0.set(Calendar.DAY_OF_MONTH,todayTime0.get(Calendar.DAY_OF_MONTH)-7);
long lastWeek=todayTime0.getTimeInMillis();
// insertData(yesterday,today,"appListYesterday");
// insertData(lastWeek,today,"lastWeekList");
UsageStatsManager manager=(UsageStatsManager) getApplicationContext().getSystemService(USAGE_STATS_SERVICE);
List<UsageStats> stats=manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,yesterday,today);
Map<String, UsageStats> statsMap = manager.queryAndAggregateUsageStats(yesterday, today);
for(UsageStats us:stats){
try {
PackageManager pm=getApplicationContext().getPackageManager();
ApplicationInfo applicationInfo=pm.getApplicationInfo(us.getPackageName(),PackageManager.GET_META_DATA);
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_CONFIGURATIONS);
int flags = packageInfo.applicationInfo.flags;
String appName = "";
for(AppInfo app: mApplicationInfos){
if(applicationInfo.packageName.equals(app.getPackage_name())){
appName=app.getLabel();
}
}
if(getTimeFromInt(us.getTotalTimeInForeground())!="已结束"){
UsageStats usageStats=statsMap.get(applicationInfo.packageName);
// 判断是否为系统应用系统
if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){
AppInfo appInfo=new AppInfo();
// 添加app名称
appInfo.setLabel(appName);
// 添加app使用时间
appInfo.setTimeString(getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setTimeLong(usageStats.getTotalTimeInForeground());
appInfo.setPackage_name(applicationInfo.packageName);
appInfo.setClassify(dbHelper.searchClassify(appInfo.getPackage_name()));
// dbHelper=timeUseDBHelper.getInstance(this);
if(!dbHelper.searchPacketName(appInfo.getPackage_name(),"appListYesterday"))
dbHelper.insertAppYesrerdayInfos(appInfo, date);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
List<UsageStats> stats1=manager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,lastWeek,today);
Map<String, UsageStats> statsMap1 = manager.queryAndAggregateUsageStats(lastWeek, today);
for(UsageStats us:stats1){
try {
PackageManager pm=getApplicationContext().getPackageManager();
ApplicationInfo applicationInfo=pm.getApplicationInfo(us.getPackageName(),PackageManager.GET_META_DATA);
PackageInfo packageInfo = pm.getPackageInfo(applicationInfo.packageName, PackageManager.GET_CONFIGURATIONS);
int flags = packageInfo.applicationInfo.flags;
String appName = "";
for(AppInfo app: mApplicationInfos){
if(applicationInfo.packageName.equals(app.getPackage_name())){
appName=app.getLabel();
}
}
if(getTimeFromInt(us.getTotalTimeInForeground())!="已结束"){
UsageStats usageStats=statsMap1.get(applicationInfo.packageName);
// 判断是否为系统应用系统
if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){
AppInfo appInfo=new AppInfo();
// 添加app名称
appInfo.setLabel(appName);
// 添加app使用时间
appInfo.setTimeLong(usageStats.getTotalTimeInForeground());
appInfo.setTimeString(getTimeFromInt(usageStats.getTotalTimeInForeground()));
appInfo.setPackage_name(applicationInfo.packageName);
appInfo.setClassify(dbHelper.searchClassify(appInfo.getPackage_name()));
// dbHelper=timeUseDBHelper.getInstance(this);
if(!dbHelper.searchPacketName(appInfo.getPackage_name(),"lastWeekList"))
dbHelper.insertLastWeekInfos(appInfo, today1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
jump_appUse.setOnClickListener(v -> {
Intent intent13 =new Intent();
intent13.setClass(report.this, appTimeUse.class);
intent13.putExtra("date",today1);
showProgressDialog("","正在加载");
startActivity(intent13);
});
jump_list.setOnClickListener(new View.OnClickListener() {
jump_list.setOnClickListener(v -> {
Intent intent12 =new Intent(report.this,task_show.class);
startActivity(intent12);
});
jump_appClassify.setOnClickListener(v -> {
Intent intent1 =new Intent();
intent1.setClass(report.this, software_classification.class);
intent1.putExtra("date",today1);
startActivity(intent1);
});
initViews();//初始化控件
initEvents();//初始化事件
selectTab(0);//默认选中第一个Tab
}
@Override
protected void onStop() {
super.onStop();
hideProgressDialog();
}
private void initEvents() {
//初始化Tab的点击事件
mTabToday.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(report.this,task_show.class);
startActivity(intent);
selectTab(0);
}
});
mTabYesterday.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectTab(1);
}
});
mTabLastWeek.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectTab(2);
}
});
}
private void initViews() {
//初始化Tab的布局文件
mTabToday = findViewById(R.id.tab_today);
mTabYesterday = findViewById(R.id.tab_yesterday);
mTabLastWeek = findViewById(R.id.tab_lastWeek);
//初始化Button
btn_today = findViewById(R.id.btn_today);
btn_yesterday = findViewById(R.id.btn_yesterday);
btn_lastWeek = findViewById(R.id.btn_lastWeek);
}
//进行选中Tab的处理
private void selectTab(int j) {
//获取FragmentManager对象
FragmentManager manager = getSupportFragmentManager();
switch (j) {
//当选中点击的是今天的Tab时
case 0:
//设置微信的ImageButton为绿色
clearColor();
btn_today.setBackgroundColor(Color.parseColor("#A9A9A9"));
//获取FragmentTransaction对象
FragmentTransaction transaction = manager.beginTransaction();
//先隐藏所有的Fragment
hideFragments(transaction);
//如果对应的Fragment没有实例化则进行实例化并显示出来
// if (mFragToday == null) {
mFragToday = new today();
transaction.add(R.id.fragment_report, mFragToday);
// } else {
//如果对应的Fragment已经实例化则直接显示出来
// transaction.show(mFragToday);
// }
// transaction.show(mFragToday);
transaction.commit();
break;
case 1:
clearColor();
btn_yesterday.setBackgroundColor(Color.parseColor("#A9A9A9"));
//获取FragmentTransaction对象
FragmentTransaction transaction1 = manager.beginTransaction();
//先隐藏所有的Fragment
hideFragments(transaction1);
// if (mFragYesterday == null) {
mFragYesterday = new yesterday();
transaction1.add(R.id.fragment_report, mFragYesterday);
// } else {
// transaction.show(mFragYesterday);
// }
// transaction1.show(mFragYesterday);
transaction1.commit();
break;
case 2:
clearColor();
btn_lastWeek.setBackgroundColor(Color.parseColor("#A9A9A9"));
//获取FragmentTransaction对象
FragmentTransaction transaction2 = manager.beginTransaction();
//先隐藏所有的Fragment
hideFragments(transaction2);
// if (mFragYesterday == null) {
mFragLastWeek = new week();
transaction2.add(R.id.fragment_report, mFragLastWeek);
// } else {
// transaction.show(mFragYesterday);
// }
// transaction2.show(mFragLastWeek);
transaction2.commit();
break;
}
//不要忘记提交事务
// transaction.commit();
}
// 显示正在加载弹窗
public void showProgressDialog(String title, String message) {
if (progressDialog == null) {
progressDialog = ProgressDialog.show(report.this,
title, message, true, false);
} else if (progressDialog.isShowing()) {
progressDialog.setTitle(title);
}
progressDialog.show();
}
// 隐藏提示加载弹窗
public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog=null;
}
//将所有Fragment隐藏
private void hideFragments(FragmentTransaction transaction) {
if (mFragToday != null) {
transaction.hide(mFragToday);
}
if (mFragYesterday != null) {
transaction.hide(mFragYesterday);
}
if (mFragLastWeek != null) {
transaction.hide(mFragLastWeek);
}
}
public void clearColor(){
btn_today.setBackgroundColor(Color.parseColor("#FFFFFF"));
btn_yesterday.setBackgroundColor(Color.parseColor("#FFFFFF"));
btn_lastWeek.setBackgroundColor(Color.parseColor("#FFFFFF"));
}
public static String getTimeFromInt(long time) {
if (time <= 0) { return "已结束"; }
// long day = time / (1 * 60 * 60 * 24);
String hour = time / (1000*60*60) % 60 +"";
String minute = time / (1000*60) % 60<10?"0"+time / (1000*60) % 60:""+time / (1000*60) % 60;
String second = time /1000 % 60<10?"0"+time / 1000 % 60:""+time / 1000 % 60;
return hour+"小时"+minute+"分钟"+second+"秒";
}
public ArrayList<AppInfo> getAllAppInfo(Context ctx) {
ArrayList<AppInfo> appBeanList = new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setIcon(p.applicationInfo.loadIcon(packageManager));
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
bean.setPackage_name(p.applicationInfo.packageName);
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
}
}
return appBeanList;
}
}

@ -1,94 +0,0 @@
package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import android.app.DatePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.TextView;
import com.tanshui.timeuse.database.timeUseDBHelper;
import java.util.Calendar;
import java.util.List;
public class show_task extends AppCompatActivity {
private TextView textView;
private Button changeDate;
private Button addTask;
private String decs;
private DatePicker picker;
private DatePickerDialog.OnDateSetListener listener;
private int nowYear;
private int nowMonth;
private int nowDay;
private timeUseDBHelper dbHelper;
private List<taskInfo> task;
private ListView lv_task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_task);
textView = findViewById(R.id.tv);
lv_task=findViewById(R.id.lv_task);
changeDate = findViewById(R.id.changeDate);
addTask=findViewById(R.id.addTask);
// 获取当前日期
Calendar now=Calendar.getInstance();
nowYear=now.get(Calendar.YEAR);
nowMonth=now.get(Calendar.MONTH);//实际月份需要加1
nowDay=now.get(Calendar.DATE);
decs=String.format("%s-%s-%s", nowYear, nowMonth, nowDay);
textView.setText(decs);
// List<taskInfo> list=dbHelper.queryAllTaskInfo();
// 点击按钮更改日期
changeDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendar = Calendar.getInstance();
DatePickerDialog dateDialog = new DatePickerDialog(show_task.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
decs = String.format("%s-%s-%s", year, month, dayOfMonth);
textView.setText(decs);
}
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
dateDialog.show();
}
});
// 点击按钮添加任务
addTask.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(show_task.this, task_add.class);
intent.putExtra("date",decs);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
dbHelper = timeUseDBHelper.getInstance(this);
dbHelper.openReadLink();
}
@Override
protected void onStop() {
super.onStop();
dbHelper.closeLink();
}
}

@ -2,21 +2,195 @@ package com.tanshui.timeuse;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import com.tanshui.timeuse.database.timeUseDBHelper;
import java.util.ArrayList;
import java.util.List;
public class software_classification extends AppCompatActivity {
private Spinner classify;
private final String[] appClassifyArray={"娱乐","学习","生活"};
private List<AppInfo> appInfoList;
private List<AppInfo> allAppList=new ArrayList<>();
private String date;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_software_classification);
classify=findViewById(R.id.classify1);
List<String> appName=new ArrayList<>();
timeUseDBHelper dbHelper = timeUseDBHelper.getInstance(this);
dbHelper.openReadLink();
appInfoList = dbHelper.queryAllClassifyInfo();
List<String> a=getAllAppInfo(this);
AppInfo appInfo=new AppInfo();
// 接受数据
Intent intent=getIntent();
date=intent.getStringExtra("date");
Spinner appList=findViewById(R.id.classify1);
Spinner classify = findViewById(R.id.classify2);
Button confirm=findViewById(R.id.confirmClassify_button);
Button jump_appUse=findViewById(R.id.classify_jump_appUse);
Button jump_list=findViewById(R.id.classify_jump_list);
Button jump_report=findViewById(R.id.classify_jump_report);
Button jump_appClassify =findViewById(R.id.classify_jump_appClassify);
// 初始化appName数组
for(AppInfo app: appInfoList){
appName.add(app.getLabel());
}
// for(int i=0;i<20;i++){
// appName.add(allAppList.get(i).label);
// }
// appInfo.package_name= appInfoList.get(0).package_name;
final int[] num = {0};
// 创建一个数组适配器存放内容为string 类型
ArrayAdapter<String> arrayAdapter1=new ArrayAdapter<>(software_classification.this,R.layout.classify_item,appName);
// 创建一个数组适配器存放内容为string 类型
ArrayAdapter<String> arrayAdapter2=new ArrayAdapter<>(software_classification.this,R.layout.classify_item,appClassifyArray);
// 为Spinner添加适配器
appList.setAdapter(arrayAdapter1);
appList.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
appInfo.setLabel(appName.get(arg2));
// arrayAdapter2.clear();
for(AppInfo app: appInfoList){
if(app.getLabel().equals(appInfo.getLabel()))
appInfo.setPackage_name(app.getPackage_name());
}
for(AppInfo app: appInfoList){
if(app.getLabel().equals(appInfo.getLabel()))
appInfo.setClassify(app.getClassify());
}
for(int i=0;i<appClassifyArray.length;i++){
if(appInfo.getClassify().equals(appClassifyArray[i]))
num[0] =i;
}
// 设置classify的初始值与应用的分类一致
classify.setSelection(num[0]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 为Spinner添加适配器
classify.setAdapter(arrayAdapter2);
classify.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
appInfo.setClassify(appClassifyArray[arg2]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
confirm.setOnClickListener(v -> {
Log.d("data",appInfo.getClassify());
if(dbHelper.updateAppClassify(appInfo)>0)
Toast.makeText(software_classification.this, "修改应用分类成功", Toast.LENGTH_SHORT).show();
// 刷新数据
appInfoList =dbHelper.queryAllClassifyInfo();
});
// 点击按钮跳转
jump_appUse.setOnClickListener(v -> {
Intent intent1 =new Intent();
intent1.setClass(software_classification.this, appTimeUse.class);
intent1.putExtra("date",date);
showProgressDialog("","正在加载");
startActivity(intent1);
});
jump_report.setOnClickListener(v -> {
Intent intent12 =new Intent();
intent12.setClass(software_classification.this, report.class);
intent12.putExtra("date",date);
showProgressDialog("","正在加载");
startActivity(intent12);
});
jump_appClassify.setOnClickListener(v -> {
Intent intent13 =new Intent();
intent13.setClass(software_classification.this, software_classification.class);
intent13.putExtra("date",date);
showProgressDialog("","正在加载");
startActivity(intent13);
});
jump_list.setOnClickListener(v -> {
Intent intent14 =new Intent();
intent14.setClass(software_classification.this, task_show.class);
startActivity(intent14);
});
}
@Override
protected void onStop() {
super.onStop();
hideProgressDialog();
}
public List<String> getAllAppInfo(Context ctx) {
List<AppInfo> appBeanList = new ArrayList<>();
List<String> a=new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
a.add(packageManager.getApplicationLabel(p.applicationInfo).toString());
}
}
return a;
}
// 显示正在加载弹窗
public void showProgressDialog(String title, String message) {
if (progressDialog == null) {
progressDialog = ProgressDialog.show(software_classification.this,
title, message, true, false);
} else if (progressDialog.isShowing()) {
progressDialog.setTitle(title);
}
progressDialog.show();
}
// 隐藏提示加载弹窗
public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog=null;
}
}

@ -1,23 +1,106 @@
package com.tanshui.timeuse;
import java.util.ArrayList;
public class taskInfo {
public String date;
public int id;
public String content;
public boolean isFinished;
public String startTime;
public String endTime;
public taskInfo(String content,boolean isFinished,String startTime,String endTime,int id,String date){
private String date;
private int id;
private String content;
private boolean isFinished;
private String startTime;
private int startMin;
private int startHour;
private int endMin;
private int endHour;
private String endTime;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setFinished(boolean finished) {
isFinished = finished;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public int getStartMin() {
return startMin;
}
public void setStartMin(int startMin) {
this.startMin = startMin;
}
public int getStartHour() {
return startHour;
}
public void setStartHour(int startHour) {
this.startHour = startHour;
}
public int getEndMin() {
return endMin;
}
public void setEndMin(int endMin) {
this.endMin = endMin;
}
public int getEndHour() {
return endHour;
}
public void setEndHour(int endHour) {
this.endHour = endHour;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public taskInfo(String content, boolean isFinished, String startTime, String endTime, int id, String date, int endMin, int startMin){
this.content=content;
this.isFinished=isFinished;
this.endTime=endTime;
this.startTime=startTime;
this.date=date;
this.id=id;
}
public taskInfo(){}
this.endMin=endMin;
this.startMin=startMin;
}
public taskInfo(){}
public boolean isFinished() {
return isFinished;

@ -1,7 +0,0 @@
package com.tanshui.timeuse;
public class taskManager {
public void addTask(){
}
}

@ -18,60 +18,55 @@ import android.widget.Toast;
import com.tanshui.timeuse.database.timeUseDBHelper;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class task_add extends AppCompatActivity {
private EditText task_content;
private Button StartTime;
private Button EndTime;
private Button btn_down;
private Button btn_del;
private TextView tv_startTime;
private TextView tv_endTime;
private String decs;
private timeUseDBHelper dbHelper;
private String date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_task_add);
taskInfo task=new taskInfo();
taskInfo task=new taskInfo();
Button StartTime;
Button EndTime;
Button btn_down;
String date;
task_content=findViewById(R.id.task_content);
StartTime=findViewById(R.id.StartTime);
EndTime=findViewById(R.id.EndTime);
btn_down=findViewById(R.id.btn_down);
tv_startTime=findViewById(R.id.tv_startTime);
tv_endTime=findViewById(R.id.tv_endTime);
// 接受数据
Intent intent=getIntent();
date=intent.getStringExtra("date");
// 默认task属性
task.isFinished=false;
task.date=date;
task.setFinished(false);
task.setDate(date);
StartTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialog dia=new Dialog(task_add.this);
dia.create();
Calendar time=Calendar.getInstance();
StartTime.setOnClickListener(v -> {
Dialog dia=new Dialog(task_add.this);
dia.create();
Calendar time=Calendar.getInstance();
// 显示时间选择器
TimePickerDialog timeDialog=new TimePickerDialog(task_add.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String min= Integer.toString(minute);
min=minute>=10?min:"0"+min;
decs = String.format("%s点%s分", hourOfDay, min);
task.startTime=decs;
tv_startTime.setText("任务开始时间:"+decs);
}
},time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE),true);
timeDialog.show();
}
TimePickerDialog timeDialog=new TimePickerDialog(task_add.this, (view, hourOfDay, minute) -> {
String min= Integer.toString(minute);
min=minute>=10?min:"0"+min;
decs = String.format("%s点%s分", hourOfDay, min);
task.setStartTime(decs);
task.setStartHour(hourOfDay);
task.setStartMin(minute);
tv_startTime.setText("任务开始时间:"+decs);
},time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE),true);
timeDialog.show();
});
EndTime.setOnClickListener(new View.OnClickListener() {
@ -87,7 +82,9 @@ public class task_add extends AppCompatActivity {
String min= Integer.toString(minute);
min=minute>=10?min:"0"+min;
decs = String.format("%s点%s分", hourOfDay, min);
task.endTime=decs;
task.setEndTime(decs);
task.setEndHour(hourOfDay);
task.setEndMin(minute);
tv_endTime.setText("任务结束时间:"+decs);
}
},time.get(Calendar.HOUR_OF_DAY),time.get(Calendar.MINUTE),true);
@ -95,49 +92,44 @@ public class task_add extends AppCompatActivity {
}
});
btn_down.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btn_down.setOnClickListener(v -> {
if(!task_content.getText().toString().isEmpty()){
task.content=task_content.getText().toString();
}else{
if(!task_content.getText().toString().isEmpty()){
task.setContent(task_content.getText().toString());
}else{
// list为空弹出提示
AlertDialog.Builder builder = new AlertDialog.Builder(task_add.this);
builder.setTitle("标题");
builder.setMessage("内容11111");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(task_add.this, "确定", Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(task_add.this, "取消", Toast.LENGTH_SHORT).show();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
return;
}
// 将新增的任务添加到数据库
if(dbHelper.insertTaskInfos(task)>0)
Toast.makeText(task_add.this,"添加任务成功",Toast.LENGTH_SHORT).show();
// 延时1秒跳转页面
new Handler().postDelayed(new Runnable() {
AlertDialog.Builder builder = new AlertDialog.Builder(task_add.this);
builder.setTitle("标题");
builder.setMessage("内容11111");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void run() {
Intent intent=new Intent(task_add.this,task_show.class);
startActivity(intent);
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(task_add.this, "确定", Toast.LENGTH_SHORT).show();
}
},1000);
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(task_add.this, "取消", Toast.LENGTH_SHORT).show();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
return;
}
});
// 将新增的任务添加到数据库
if(dbHelper.insertTaskInfos(task)>0)
Toast.makeText(task_add.this,"添加任务成功",Toast.LENGTH_SHORT).show();
// 延时1秒跳转页面
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent1 =new Intent(task_add.this,task_show.class);
startActivity(intent1);
}
},1000);
});
}
@Override

@ -1,48 +1,49 @@
package com.tanshui.timeuse;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import androidx.core.app.NotificationCompat;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AppOpsManager;
import android.app.DatePickerDialog;
import android.app.FragmentTransaction;
import android.app.Person;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.text.method.DigitsKeyListener;
import android.util.Log;
import android.os.Handler;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.tanshui.timeuse.adapter.MainViewPagerAdapter;
import com.tanshui.timeuse.database.timeUseDBHelper;
import com.tanshui.timeuse.fragment.main_tabFragment;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -60,6 +61,8 @@ public class task_show extends Activity {
private timeUseDBHelper dbHelper;
private ListView lv_task;
private List<taskInfo> taskInfos;
private List<AppInfo> appInfos;
private ArrayList<HashMap<String, Object>> listItem;
private SimpleAdapter adapter;
private SQLiteDatabase write;
@ -68,6 +71,15 @@ public class task_show extends Activity {
private Button dialog_delete;
private EditText dialog_edit;
private CheckBox dialog_check;
private NotificationManager notificationManager;
private Notification notification;
private Handler handler;
private List<String> finishTask=new ArrayList<>();
private Runnable runnable;
private Boolean f;
private NotificationChannel channel;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -75,7 +87,9 @@ public class task_show extends Activity {
setContentView(R.layout.activity_task_show);
// main_tabFragment main_tabFragment=new main_tabFragment();
// getSupportFragmentManager().beginTransaction().add(R.id.main_frame, main_tabFragment).show(main_tabFragment).commitAllowingStateLoss();
List<AppInfo> classifyList;
View jump_appClassify;
textView = findViewById(R.id.tv);
lv_task=findViewById(R.id.lv_task);
changeDate = findViewById(R.id.changeDate);
@ -83,74 +97,122 @@ public class task_show extends Activity {
jump_appUse=findViewById(R.id.jump_appUse);
jump_list=findViewById(R.id.jump_list);
jump_report=findViewById(R.id.jump_report);
jump_appClassify =findViewById(R.id.jump_appClassify);
// 获取当前日期
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd" );
Calendar now=Calendar.getInstance();
nowYear=now.get(Calendar.YEAR);
nowMonth=now.get(Calendar.MONTH);//实际月份需要加1
nowMonth=now.get(Calendar.MONTH)+1;//实际月份需要加1
nowDay=now.get(Calendar.DATE);
decs=String.format("%s-%s-%s", nowYear, nowMonth, nowDay);
decs=simpleDateFormat.format(now.getTime());
// decs=String.format("%s-%s-%s", nowYear, nowMonth, nowDay);
textView.setText(decs);
dbHelper=timeUseDBHelper.getInstance(task_show.this);
dbHelper.openReadLink();
dbHelper.openWriteLink();
appInfos=dbHelper.queryAllAppInfo();
listItem= new ArrayList<>();
// 如果第一次打开查看app使用界面打开应用权限
if (!isStatAccessPermissionSet()) {
classifyList=getAllAppInfo(task_show.this);
for(AppInfo app:classifyList){
dbHelper.insertClassifyInfos(app);
}
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
this.startActivity(intent);
}
if(!appInfos.isEmpty())
if(!decs.equals(appInfos.get(2).getDate())){
// 如果在第二天打开软件则清空appList中的date、appUseTimeLong和appUseTimeString数据
dbHelper.clearAppUseTime(appInfos.get(2).getDate());
}
// 点击按钮更改日期
changeDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendar = Calendar.getInstance();
DatePickerDialog dateDialog = new DatePickerDialog(task_show.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
// 更新日期选择器为新选的日期
nowYear=year;
nowMonth=month;
nowDay=dayOfMonth;
decs = String.format("%s-%s-%s", year, month, dayOfMonth);
setList();
textView.setText(decs);
}
},
nowYear,
nowMonth,
nowDay);
dateDialog.show();
listItem= new ArrayList<>();
// 定义通知的manager和channel
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
channel = new NotificationChannel("test","124",NotificationManager.IMPORTANCE_HIGH);
// 自动循环每5s执行一次send函数实现对任务开始时间的监听
handler = new Handler();
f = true;
runnable = new Runnable() {
@Override
public void run() {
/*
*
* */
f =send();
handler.sendEmptyMessage(1);
if(!f)
handler.postDelayed(this, 5 * 1000);//延迟5秒,再次执行task本身,实现了循环的效果
else
handler.removeCallbacks(runnable);
}
};
// 点击按钮更改日期
changeDate.setOnClickListener(v -> {
DatePickerDialog dateDialog = new DatePickerDialog(task_show.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
// 更新日期选择器为新选的日期
nowYear=year;
nowMonth=month+1;
nowDay=dayOfMonth;
String day=dayOfMonth>=10?dayOfMonth+"":"0"+dayOfMonth;
String months=month+1>=10?month+1+"":"0"+month+1;
decs = String.format("%s-%s-%s", year, months, day);
setList();
textView.setText(decs);
}
},
nowYear,
nowMonth-1,
nowDay);
dateDialog.show();
});
// 点击按钮添加任务
addTask.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(task_show.this, task_add.class);
intent.putExtra("date",decs);
startActivity(intent);
}
addTask.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(task_show.this, task_add.class);
intent.putExtra("date",decs);
startActivity(intent);
});
// 点击按钮跳转
jump_appUse.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(task_show.this,appTimeUse.class);
startActivity(intent);
}
jump_appUse.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(task_show.this, appTimeUse.class);
intent.putExtra("date",decs);
showProgressDialog("","正在加载");
startActivity(intent);
});
jump_report.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(task_show.this,report.class);
startActivity(intent);
}
jump_report.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(task_show.this, report.class);
intent.putExtra("date",decs);
showProgressDialog("","正在加载");
startActivity(intent);
});
jump_appClassify.setOnClickListener(v -> {
Intent intent=new Intent();
intent.setClass(task_show.this, software_classification.class);
intent.putExtra("date",decs);
startActivity(intent);
});
// CheckboxAdapter checkboxAdapter=new CheckboxAdapter(task_show.this,listItem);
// lv_task.setAdapter(checkboxAdapter);
@ -183,41 +245,54 @@ public class task_show extends Activity {
// Toast.makeText(task_show.this, isChecked+"("+position+")", Toast.LENGTH_SHORT).show();
// }
// });
//
// Toast.makeText(task_show.this, position+"", Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onStart() {
super.onStart();
// 开始监听任务开始时间
handler.postDelayed(runnable,1000);
dbHelper = timeUseDBHelper.getInstance(task_show.this);
dbHelper.openReadLink();
write=dbHelper.openWriteLink();
// 从数据库获取任务列表
taskInfos=dbHelper.queryAllTaskInfo();
appInfos=dbHelper.queryAllAppInfo();
setList();
for(taskInfo item:taskInfos){
if(item.getDate().equals(decs)){
if(!finishTask.contains(item.getContent()))
finishTask.add(item.getContent());
}
}
}
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(runnable);
hideProgressDialog();
}
// 生成任务列表
public void setList(){
// 生成任务列表
public void setList(){
if(!taskInfos.isEmpty()){
listItem.clear();
for(taskInfo item:taskInfos){
// 根据日期获取任务
if(item.date.equals(decs)){
if(item.getDate().equals(decs)){
HashMap<String,Object> map = new HashMap<>();
// 添加任务内容
map.put("ItemContent", item.content);
map.put("ItemContent", item.getContent());
// 添加任务开始时间
map.put("ItemStartTime", item.startTime+"-");
map.put("ItemStartTime", item.getStartTime()+"-");
// 添加任务结束时间
map.put("ItemEndTime",item.endTime);
map.put("ItemEndTime",item.getEndTime());
// 添加任务完成状态
map.put("ItemISFinished",item.isFinished);
map.put("ItemISFinished",item.isFinished());
listItem.add(map);
}
@ -233,6 +308,60 @@ public class task_show extends Activity {
lv_task.setAdapter(adapter);
}
}
// 当任务即将到达完成时间时,发送通知
public Boolean send(){
Calendar calendar=Calendar.getInstance();
String name="";
for(taskInfo item:taskInfos){
if(item.getDate().equals(decs)){
for(String a:finishTask){
// Toast.makeText(this, a+"", Toast.LENGTH_SHORT).show();
if(item.getContent().equals(a)){
int time=((item.getStartHour()*60+item.getStartMin())-calendar.get(Calendar.HOUR_OF_DAY)*60-calendar.get(Calendar.MINUTE));
// 在任务开始前30分钟提醒用户
if(time<=30&&time>0){
notificationManager.createNotificationChannel(channel);
// 点击通知跳转到task_show
Intent intent=new Intent(task_show.this,task_show.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_IMMUTABLE);
notification = new NotificationCompat.Builder(task_show.this,"test")
.setContentTitle("任务即将开始通知")
.setContentText("距您设置的任务:"+item.getContent()+" 开始还有"+time+"分钟")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
//设置点击后取消Notification
.setAutoCancel(true)
.setContentIntent(pendingIntent)
// 将通知位置往前放
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build();
name=a;
// 发送通知
notificationManager.notify((int)(Math.random() * 100),notification);
}
}
}
finishTask.remove(name);
}
}
return finishTask.size()==0;
// return flag == 1;
}
public void showProgressDialog(String title, String message) {
if (progressDialog == null) {
progressDialog = ProgressDialog.show(task_show.this,
title, message, true, false);
} else if (progressDialog.isShowing()) {
progressDialog.setTitle(title);
}
progressDialog.show();
}
//显示修改任务的dialog
public void showCustomInputDialog(final int position) {
@ -240,32 +369,29 @@ public class task_show extends Activity {
mlayoutInflater=LayoutInflater.from(this);
dialogView=mlayoutInflater.inflate(R.layout.dialog, null);
// 注意MainActivity如有自己的布局文件这个dialog是view的布局文件一定要把View写上
dialog_delete =(Button) dialogView.findViewById(R.id.dialog_delete);
dialog_edit =(EditText) dialogView.findViewById(R.id.dialog_edit);
dialog_check =(CheckBox) dialogView.findViewById(R.id.dialog_check);
dialog_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder1=new AlertDialog.Builder(task_show.this);
builder1.setMessage("确定删除?");
builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContentValues values = new ContentValues();
values.put("content" , dialog_edit.getText().toString());
write.delete("taskList","content=?",new String[]{listItem.get(position).get("ItemContent").toString()});
// 重新从数据库获取修改的数据
taskInfos=dbHelper.queryAllTaskInfo();
setList();
Toast.makeText(task_show.this, "删除成功", Toast.LENGTH_SHORT).show();
}
});
builder1.setNegativeButton("取消", null);
builder1.show();
}
dialog_delete = dialogView.findViewById(R.id.dialog_delete);
dialog_edit = dialogView.findViewById(R.id.dialog_edit);
dialog_check = dialogView.findViewById(R.id.dialog_check);
dialog_delete.setOnClickListener(v -> {
AlertDialog.Builder builder1=new AlertDialog.Builder(task_show.this);
builder1.setMessage("确定删除?");
builder1.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ContentValues values = new ContentValues();
values.put("content" , dialog_edit.getText().toString());
write.delete("taskList","content=?",new String[]{listItem.get(position).get("ItemContent").toString()});
// 重新从数据库获取修改的数据
taskInfos=dbHelper.queryAllTaskInfo();
setList();
Toast.makeText(task_show.this, "删除成功", Toast.LENGTH_SHORT).show();
}
});
builder1.setNegativeButton("取消", null);
builder1.show();
});
/*Dialog dialog = new MyDialog(PublishActivity.this,R.style.MyDialog);
dialog.show();*/
@ -293,4 +419,45 @@ public class task_show extends Activity {
builder.setNegativeButton("取消", null);
builder.show();
}
// 隐藏提示加载弹窗
public void hideProgressDialog() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog=null;
}
// 打开应用权限
public boolean isStatAccessPermissionSet() {
try {
PackageManager packageManager = this.getPackageManager();
ApplicationInfo info = packageManager.getApplicationInfo(this.getPackageName(), 0);
AppOpsManager appOpsManager = (AppOpsManager) this.getSystemService(APP_OPS_SERVICE);
return appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, info.uid, info.packageName) == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public ArrayList<AppInfo> getAllAppInfo(Context ctx) {
ArrayList<AppInfo> appBeanList = new ArrayList<>();
AppInfo bean = null;
PackageManager packageManager = ctx.getPackageManager();
List<PackageInfo> list = packageManager.getInstalledPackages(0);
for (PackageInfo p : list) {
bean = new AppInfo();
bean.setLabel(packageManager.getApplicationLabel(p.applicationInfo).toString());
bean.setPackage_name(p.applicationInfo.packageName);
int flags = p.applicationInfo.flags;
// 判断是否是属于系统的apk
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
// bean.setSystem(true);
} else {
appBeanList.add(bean);
}
}
return appBeanList;
}
}

@ -0,0 +1,60 @@
package com.tanshui.timeuse.util;
import java.util.ArrayList;
import java.util.Random;
import android.graphics.Color;
/**
* Created by 54966 on 2018/3/8.
*/
public class ColorRandom {
private ArrayList<Integer> colorArrays;
private int count;
public ColorRandom(int count) {
colorArrays = new ArrayList<>(count);
this.count = count;
setColor();
}
private void setColor() {
for (int i = 0; i < count; i++) {
int color = getColor();
colorArrays.add(color);
}
}
private Integer getColor() {
int color = Color.parseColor("#FFA500");
while (colorArrays.contains(color) || "#FFFFFF".equals(color)) {
color = getRandColorCode();
if (!colorArrays.contains(color)) {
break;
}
}
return color;
}
public ArrayList getColors() {
return colorArrays;
}
private Integer getRandColorCode() {
String r, g, b;
Random random = new Random();
r = Integer.toHexString(random.nextInt(256)).toUpperCase();
g = Integer.toHexString(random.nextInt(256)).toUpperCase();
b = Integer.toHexString(random.nextInt(256)).toUpperCase();
r = r.length() == 1 ? "0" + r : r;
g = g.length() == 1 ? "0" + g : g;
b = b.length() == 1 ? "0" + b : b;
return Color.parseColor("#" + r + g + b);
}
}

@ -0,0 +1,148 @@
package com.tanshui.timeuse.util;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import com.tanshui.timeuse.PieInfo;
import java.util.List;
public class PieChart extends View {
private Paint mChartPaint;
private Paint mCirclePaint; // 中心圆
private RectF mRectF;
private int padding;
private List<PieInfo> mPieModelList;
// 绘画当前角度
private float mAnimaAngle;
private RectF mSelectedRectF = new RectF();
public PieChart(Context context) {
this(context, null);
}
public PieChart(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public PieChart(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mChartPaint = new Paint();
mChartPaint.setAntiAlias(true);
mChartPaint.setDither(true);
mChartPaint.setStrokeWidth(100);
mChartPaint.setStyle(Paint.Style.FILL);
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStyle(Paint.Style.FILL);
mCirclePaint.setColor(Color.WHITE);
}
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override protected void onDraw(Canvas canvas) {
if (mPieModelList == null || mPieModelList.isEmpty()) {
return;
}
for (int i = 0; i < mPieModelList.size(); i++) {
if (mPieModelList.get(i).getPercent() > 0) {
// 如果当前角度在这个扇形中
if (mAnimaAngle >= mPieModelList.get(i).getStartAngle() &&
mAnimaAngle <= (mPieModelList.get(i).getStartAngle() + mPieModelList.get(i).getSweepAngle())) {
drawColor(canvas, mPieModelList.get(i).getColor(), mPieModelList.get(i).getStartAngle(), mAnimaAngle - mPieModelList.get(i).getStartAngle());
}
// 如果当前角度进入第二个扇形
else if (mAnimaAngle >= (mPieModelList.get(i).getStartAngle() + mPieModelList.get(i).getSweepAngle())) {
drawColor(canvas, mPieModelList.get(i).getColor(), mPieModelList.get(i).getStartAngle(), mPieModelList.get(i).getSweepAngle());
}
// 如果seleted为true让该部分突出
if (mPieModelList.get(i).isSelected()) {
drawSelectedView(canvas, mPieModelList.get(i).getColor(), mPieModelList.get(i).getStartAngle(), mPieModelList.get(i).getSweepAngle());
}
}
}
// 绘制中心为一个白色的圆
canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredWidth() / 2, padding, mCirclePaint);
}
private void drawColor(Canvas canvas, int color, float startAngle, float sweepAngle) {
mChartPaint.setColor(color);
// 设置透明
mChartPaint.setAlpha(255);
// 画圆弧
// mRectF是绘制的矩形区域
// startAngle是开始角度
// sweepAngle是扫过的角度也就是你要绘制多少度
// true为useCenter这是你是否采用填充的形式
// mChartPaint是你的画笔需要绘制什么颜色啊采用什么绘制样式啊等。
canvas.drawArc(mRectF, startAngle, sweepAngle, true, mChartPaint);
}
//选中扇形突出
private void drawSelectedView(Canvas canvas, int color, float startAngle, float sweepAngle) {
mChartPaint.setColor(color);
mChartPaint.setAlpha(255);
canvas.drawArc(mSelectedRectF, startAngle, sweepAngle, true, mChartPaint);
}
//开始绘制饼状图
public void startAnima() {
final ValueAnimator mValueAnimator = ValueAnimator.ofFloat(0f, 360f);
mValueAnimator.setDuration(2 * 1000);
mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override public void onAnimationUpdate(ValueAnimator animation) {
mAnimaAngle = (float) animation.getAnimatedValue();
invalidate();
}
});
mValueAnimator.start();
}
public void setData(List<PieInfo> pieModelList) {
Log.d("data","123");
this.mPieModelList = pieModelList;
for (int i = 0; i < mPieModelList.size(); i++) {
PieInfo model = mPieModelList.get(i);
if (i == 0) {
model.setStartAngle(0);
} else {
model.setStartAngle(mPieModelList.get(i - 1).getStartAngle() + mPieModelList.get(i - 1).getSweepAngle());
}
model.setSweepAngle(model.getPercent() * 360);
}
}
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
padding = w / 6;
mRectF = new RectF(padding, padding, w - padding, w - padding);
mSelectedRectF.set(mRectF);
// 图形突出
mSelectedRectF.inset(-30, -30);
}
}

@ -0,0 +1,47 @@
package com.tanshui.timeuse.util;
public class dateList {
private String date;
private int num;
private int finishedNum;
public int getFinishedNum() {
return finishedNum;
}
public void setFinishedNum(int finishedNum) {
this.finishedNum = finishedNum;
}
private float dates;
public float getDates() {
return dates;
}
public void setDates(float dates) {
this.dates = dates;
}
public dateList(String date, int num) {
this.date = date;
this.num = num;
}
public dateList(){}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}

@ -0,0 +1,5 @@
package com.tanshui.timeuse.util;
public class getApp {
}

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_color_enter" android:state_pressed="true"></item>
<item android:drawable="@drawable/btn_color_enter" android:state_pressed="true" ></item>
</selector>

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#b1b1b1" />
<solid android:color="#625B57" />
<!-- 设置圆角 -->
<corners android:radius="10dp" />
<!-- 设置边框 -->
<stroke
android:width="1px"
android:color="#efefef" />
android:color="#625B57" />
<!--left to right-->

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".add_task">
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".appTimeUse">
<ListView
android:id="@+id/lv_app1"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:orientation="horizontal"
android:background="@color/tabColor"
android:layout_marginTop="10dp">
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_list1"
android:text="任务清单">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@color/btnColor"
android:id="@+id/jump_app_appUse1"
android:text="应用使用情况">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_report1"
android:text="分析报告">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_appClassify1"
android:text="应用分类">
</Button>
</LinearLayout>
</LinearLayout>

@ -13,36 +13,44 @@
></ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="45dp"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
android:background="@color/tabColor"
android:layout_marginTop="5dp">
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_list"
android:text="查看任务清单">
android:text="任务清单">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:background="@color/btnColor"
android:id="@+id/jump_app_appUse"
android:text="查看应用使用情况">
android:text="应用使用情况">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_report"
android:text="查看分析报告">
android:text="分析报告">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_app_appClassify"
android:text="应用分类">
</Button>
</LinearLayout>
</LinearLayout>

@ -5,80 +5,112 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".report"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp"
>
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/title"
android:text="查看分析报告"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="任务数量:"
android:textSize="20dp">
android:layout_weight="1"
android:id="@+id/tab_today"
android:gravity="center"
android:orientation="horizontal">
</TextView>
<TextView
android:layout_width="match_parent"
<Button
android:id="@+id/btn_today"
android:clickable="false"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@drawable/btn_basic"
android:text="今日报告"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="任务完成率:"
android:textSize="20dp">
android:layout_weight="1"
android:id="@+id/tab_yesterday"
android:gravity="center"
android:orientation="horizontal">
</TextView>
<TextView
android:layout_width="match_parent"
<Button
android:id="@+id/btn_yesterday"
android:clickable="false"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@drawable/btn_basic"
android:text="昨日报告"/>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="任务量趋势:"
android:textSize="20dp">
android:layout_weight="1"
android:id="@+id/tab_lastWeek"
android:gravity="center"
android:orientation="horizontal">
</TextView>
<Button
android:id="@+id/btn_lastWeek"
android:clickable="false"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:background="@drawable/btn_basic"
android:text="最近七天"/>
</LinearLayout>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/fragment_report"
android:layout_weight="1" />
<LinearLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="45dp"
android:gravity="center"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
android:layout_marginTop="5dp">
android:background="@color/tabColor"
android:layout_marginTop="10dp">
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_list2"
android:text="查看任务清单">
android:text="任务清单">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_appUse2"
android:text="查看应用使用情况">
android:text="应用使用情况">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:background="@color/btnColor"
android:id="@+id/jump_report2"
android:text="查看分析报告">
android:text="分析报告">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_appClassify2"
android:text="应用分类">
</Button>
</LinearLayout>

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".show_task"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:gravity="center"
android:id="@+id/tv"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/lv_task">
</ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/changeDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/changeDate"
android:layout_weight="1"
/>
<Button
android:id="@+id/addTask"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/addTask"
android:layout_weight="1"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".software_classification">
tools:context=".software_classification"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp">
@ -18,20 +19,20 @@
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="软件选择:"
android:gravity="center"
android:gravity="end"
android:textSize="19sp">
</TextView>
<Spinner
android:layout_width="100dp"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:id="@+id/classify1"
android:entries="@array/app"
>
</Spinner>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp">
<TextView
@ -39,14 +40,13 @@
android:layout_height="wrap_content"
android:text="软件分类选择:"
android:textSize="19sp"
android:gravity="center">
android:gravity="end">
</TextView>
<Spinner
android:layout_width="100dp"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:id="@+id/classify2"
android:entries="@array/app"
>
</Spinner>
@ -54,8 +54,53 @@
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="确认">
android:text="确认"
android:id="@+id/confirmClassify_button">
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:orientation="horizontal"
android:background="@color/tabColor"
android:gravity="center"
android:layout_marginTop="10dp">
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/classify_jump_list"
android:text="任务清单">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/classify_jump_appUse"
android:text="应用使用情况">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/classify_jump_report"
android:text="分析报告">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@color/btnColor"
android:id="@+id/classify_jump_appClassify"
android:text="应用分类">
</Button>
</LinearLayout>
</LinearLayout>

@ -49,38 +49,47 @@
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="45dp"
android:gravity="center"
android:background="@color/tabColor"
android:orientation="horizontal"
android:layout_marginBottom="10dp"
android:layout_marginTop="5dp"
android:layout_marginTop="10dp"
android:layout_alignParentBottom="true">
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:background="@color/btnColor"
android:id="@+id/jump_list"
android:text="查看任务清单">
android:text="任务清单">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_appUse"
android:text="查看应用使用情况">
android:text="应用使用情况">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_report"
android:text="查看分析报告">
android:text="分析报告">
</Button>
<Button
android:layout_width="120dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="@drawable/btn_basic"
android:id="@+id/jump_appClassify"
android:text="应用分类">
</Button>
</LinearLayout>
</LinearLayout>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:textColor="@android:color/black"
android:textSize="14sp"
android:gravity="center"/>

@ -1,14 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".appTimeUse">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="123123">
android:layout_height="match_parent">
</TextView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -1,44 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".report"
android:orientation="vertical"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/title"
android:text="查看分析报告"
android:textSize="20dp">
android:layout_height="match_parent">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="任务数量:"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="任务完成率:"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="任务量趋势:"
android:textSize="20dp">
</TextView>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/taskNumber"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/finishRate"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/taskNumRate"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/top_five"
android:textSize="20dp">
</TextView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.tanshui.timeuse.util.PieChart
android:id="@+id/pie_chart1"
android:layout_width="220dp"
android:layout_height="220dp"
android:layout_gravity="center"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_marginLeft="30dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn4" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn5" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_btn6" />
</LinearLayout>
</LinearLayout>
<!-- <com.tanshui.timeuse.util.PieChart-->
<!-- android:id="@+id/pie_chart"-->
<!-- android:layout_width="200dp"-->
<!-- android:layout_height="200dp"-->
<!-- android:background="@color/endColor"-->
<!-- />-->
</LinearLayout>

@ -0,0 +1,173 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/week_taskNumber"
android:text="任务最多的天数,完成率最高的天数"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/week_finishRate"
android:layout_marginBottom="20dp"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/week_topTaskNumber"
android:layout_marginBottom="20dp"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/week_topFinishRate"
android:layout_marginBottom="20dp"
android:textSize="20dp">
</TextView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tanshui.timeuse.util.PieChart
android:id="@+id/week_pie_chart1"
android:layout_width="200dp"
android:layout_height="200dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn4" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn5" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn6" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.tanshui.timeuse.util.PieChart
android:id="@+id/week_pie_chart2"
android:layout_width="200dp"
android:layout_height="200dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn21"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn22" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="15dp"
android:id="@+id/week_pie_btn23" />
</LinearLayout>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="有关任务的折线图"
android:layout_marginBottom="20dp"
android:layout_marginTop="10dp"
android:textSize="20dp"/>
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginBottom="40dp"
>
</com.github.mikephil.charting.charts.LineChart>
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="300dp"
>
</com.github.mikephil.charting.charts.LineChart>
</LinearLayout>
</ScrollView>
<!-- <com.tanshui.timeuse.util.PieChart-->
<!-- android:id="@+id/pie_chart"-->
<!-- android:layout_width="200dp"-->
<!-- android:layout_height="200dp"-->
<!-- android:background="@color/endColor"-->
<!-- />-->
</LinearLayout>

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/taskNumber_yesterday"
android:textSize="20dp">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/finishRate_yesterday"
android:textSize="20dp">
</TextView>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.tanshui.timeuse.util.PieChart
android:id="@+id/pie_chart2"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="180dp"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_marginLeft="30dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn2" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn3" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn4" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn5" />
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/pie_yesterday_btn6" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

@ -11,4 +11,6 @@
<color name="startColor">#2cc9df</color>
<color name="basicColor">#ebebeb</color>
<color name="titleColor">#00c3e1</color>
<color name="tabColor">#b1b1b1</color>
<color name="btnColor">#625B57</color>
</resources>

@ -6,4 +6,5 @@ plugins {
task clean(type: Delete) {
delete rootProject.buildDir
}
}

Loading…
Cancel
Save