From 3c65e322a7ff71e95188856bd892868d4ec31869 Mon Sep 17 00:00:00 2001 From: rex <835708122@qq.com> Date: Thu, 30 May 2019 21:20:23 +0800 Subject: [PATCH] bug fix 141 --- .../kit/common/PerformanceDataManager.java | 8 +- .../kit/custom/MonitorDataUploadFragment.java | 18 ++ .../kit/custom/PageDataFragment.java | 177 ++++++++++++++++++ .../doraemonkit/kit/custom/PageDataItem.java | 65 +++++++ .../kit/custom/PageDataItemAdapter.java | 96 ++++++++++ .../custom/RealTimePerformDataFloatPage.java | 162 ++++++++++++++++ .../res/drawable-xxhdpi/dk_float_button.png | Bin 0 -> 11404 bytes .../dk_performance_down_arrow.png | Bin 0 -> 332 bytes .../src/main/res/drawable/dk_divider_gray.xml | 6 + .../drawable/dk_perform_data_background.xml | 6 + .../main/res/layout/dk_float_perform_data.xml | 72 +++++++ .../layout/dk_fragment_monitor_pagedata.xml | 25 +++ .../dk_fragment_monitor_pagedata_item.xml | 55 ++++++ ...dk_fragment_monitor_pagedata_item_item.xml | 48 +++++ .../src/main/res/values-en-rUS/strings.xml | 5 + .../src/main/res/values-zh-rCN/strings.xml | 5 + .../src/main/res/values/strings.xml | 5 + 17 files changed, 751 insertions(+), 2 deletions(-) create mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataFragment.java create mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItem.java create mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItemAdapter.java create mode 100644 Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/RealTimePerformDataFloatPage.java create mode 100644 Android/doraemonkit/src/main/res/drawable-xxhdpi/dk_float_button.png create mode 100644 Android/doraemonkit/src/main/res/drawable-xxhdpi/dk_performance_down_arrow.png create mode 100644 Android/doraemonkit/src/main/res/drawable/dk_divider_gray.xml create mode 100644 Android/doraemonkit/src/main/res/drawable/dk_perform_data_background.xml create mode 100644 Android/doraemonkit/src/main/res/layout/dk_float_perform_data.xml create mode 100644 Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata.xml create mode 100644 Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item.xml create mode 100644 Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item_item.xml diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/common/PerformanceDataManager.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/common/PerformanceDataManager.java index 6aee701d..49a2de55 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/common/PerformanceDataManager.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/common/PerformanceDataManager.java @@ -19,6 +19,7 @@ import com.didichuxing.doraemonkit.R; import com.didichuxing.doraemonkit.config.PerformanceInfoConfig; import com.didichuxing.doraemonkit.kit.custom.PerformanceInfo; import com.didichuxing.doraemonkit.kit.custom.UploadMonitorInfoBean; +import com.didichuxing.doraemonkit.kit.network.NetworkManager; import com.didichuxing.doraemonkit.util.FileManager; import com.didichuxing.doraemonkit.util.JsonUtil; import com.didichuxing.doraemonkit.util.LogHelper; @@ -227,7 +228,7 @@ public class PerformanceDataManager { startMonitorMemoryInfo(); } if (PerformanceInfoConfig.isTrafficOpen(mContext)) { - // TODO: 2019/3/22 开始流量监控 + NetworkManager.get().startMonitor(); } mHandler.sendEmptyMessageDelayed(MSG_SAVE_LOCAL, NORMAL_FRAME_RATE * 1000); } @@ -239,7 +240,7 @@ public class PerformanceDataManager { stopMonitorFrameInfo(); stopMonitorCPUInfo(); stopMonitorMemoryInfo(); - // TODO: 2019/3/22 结束流量监控 + NetworkManager.get().stopMonitor(); } public boolean isUploading(){ @@ -433,6 +434,9 @@ public class PerformanceDataManager { return filePath + fpsFileName; } + public String getCustomFilePath() { + return filePath + customFileName; + } public long getLastFrameRate() { return mLastFrameRate; } diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/MonitorDataUploadFragment.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/MonitorDataUploadFragment.java index a22af85e..cd105324 100644 --- a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/MonitorDataUploadFragment.java +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/MonitorDataUploadFragment.java @@ -11,8 +11,13 @@ import android.widget.TextView; import com.didichuxing.doraemonkit.R; import com.didichuxing.doraemonkit.config.PerformanceInfoConfig; +import com.didichuxing.doraemonkit.constant.PageTag; +import com.didichuxing.doraemonkit.kit.colorpick.ColorPickerInfoFloatPage; import com.didichuxing.doraemonkit.kit.common.PerformanceDataManager; +import com.didichuxing.doraemonkit.ui.KitFloatPage; import com.didichuxing.doraemonkit.ui.base.BaseFragment; +import com.didichuxing.doraemonkit.ui.base.FloatPageManager; +import com.didichuxing.doraemonkit.ui.base.PageIntent; import com.didichuxing.doraemonkit.ui.realtime.OnFloatPageChangeListener; import com.didichuxing.doraemonkit.ui.realtime.RealTimeChartIconPage; import com.didichuxing.doraemonkit.ui.realtime.RealTimeChartPage; @@ -56,6 +61,7 @@ public class MonitorDataUploadFragment extends BaseFragment implements OnFloatPa mSettingItemAdapter.append(new SettingItem(R.string.dk_frameinfo_cpu, PerformanceInfoConfig.isCPUOpen(getContext()))); mSettingItemAdapter.append(new SettingItem(R.string.dk_frameinfo_ram, PerformanceInfoConfig.isMemoryOpen(getContext()))); mSettingItemAdapter.append(new SettingItem(R.string.dk_kit_net_monitor, PerformanceInfoConfig.isTrafficOpen(getContext()))); + mSettingItemAdapter.append(new SettingItem(R.string.dk_platform_monitor_view_stat_data, R.drawable.dk_more_icon)); mSettingItemAdapter.setOnSettingItemSwitchListener(new SettingItemAdapter.OnSettingItemSwitchListener() { @Override @@ -72,6 +78,14 @@ public class MonitorDataUploadFragment extends BaseFragment implements OnFloatPa setCommitButtonState(); } }); + mSettingItemAdapter.setOnSettingItemClickListener(new SettingItemAdapter.OnSettingItemClickListener() { + @Override + public void onSettingItemClick(View view, SettingItem data) { + if (data.desc == R.string.dk_platform_monitor_view_stat_data) { + showContent(PageDataFragment.class); + } + } + }); mSettingList.setAdapter(mSettingItemAdapter); mCommitButton.setOnClickListener(new View.OnClickListener() { @Override @@ -79,9 +93,13 @@ public class MonitorDataUploadFragment extends BaseFragment implements OnFloatPa if (mCommitButton.getText().equals(getString(R.string.dk_platform_monitor_data_button_stop))) { mCommitButton.setText(R.string.dk_platform_monitor_data_button); PerformanceDataManager.getInstance().stopUploadMonitorData(); + FloatPageManager.getInstance().removeAll(RealTimePerformDataFloatPage.class); } else { mCommitButton.setText(R.string.dk_platform_monitor_data_button_stop); PerformanceDataManager.getInstance().startUploadMonitorData(); + PageIntent pageIntent = new PageIntent(RealTimePerformDataFloatPage.class); + pageIntent.mode = PageIntent.MODE_SINGLE_INSTANCE; + FloatPageManager.getInstance().add(pageIntent); } } }); diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataFragment.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataFragment.java new file mode 100644 index 00000000..bafeb232 --- /dev/null +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataFragment.java @@ -0,0 +1,177 @@ +package com.didichuxing.doraemonkit.kit.custom; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.didichuxing.doraemonkit.R; +import com.didichuxing.doraemonkit.kit.common.PerformanceDataManager; +import com.didichuxing.doraemonkit.ui.base.BaseFragment; +import com.didichuxing.doraemonkit.ui.fileexplorer.FileInfo; +import com.didichuxing.doraemonkit.ui.widget.recyclerview.DividerItemDecoration; +import com.didichuxing.doraemonkit.ui.widget.titlebar.HomeTitleBar; +import com.didichuxing.doraemonkit.ui.widget.titlebar.TitleBar; +import com.didichuxing.doraemonkit.util.JsonUtil; +import com.google.gson.reflect.TypeToken; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class PageDataFragment extends BaseFragment { + private RecyclerView mRvList; + private PageDataItemAdapter mAdapter; + + @Override + protected int onRequestLayout() { + return R.layout.dk_fragment_monitor_pagedata; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + initView(); + + initData(); + } + + private void initView() { + TitleBar titleBar = findViewById(R.id.title_bar); + titleBar.setOnTitleBarClickListener(new TitleBar.OnTitleBarClickListener() { + @Override + public void onLeftClick() { + getActivity().onBackPressed(); + } + + @Override + public void onRightClick() { + + } + }); + + mRvList = findViewById(R.id.info_list); + LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); + mRvList.setLayoutManager(layoutManager); + mAdapter = new PageDataItemAdapter(getContext()); + mRvList.setAdapter(mAdapter); + DividerItemDecoration decoration = new DividerItemDecoration(DividerItemDecoration.VERTICAL); + decoration.setDrawable(getResources().getDrawable(R.drawable.dk_divider_gray)); + mRvList.addItemDecoration(decoration); + mRvList.setAdapter(mAdapter); + } + + private void initData() { + new LoadDataTask().execute(PerformanceDataManager.getInstance().getCustomFilePath()); + } + + private class LoadDataTask extends AsyncTask> { + @Override + protected void onPostExecute(List items) { + mAdapter.setData(items); + } + + @Override + protected List doInBackground(String... strings) { + File file = new File(strings[0]); + + String fileString = getFileString(file); + fileString = '['+fileString+']'; + fileString = fileString.replaceAll("\\}\\{","},{"); + + List infoBeans = JsonUtil.jsonToList(fileString, UploadMonitorInfoBean.class); + + return convert2ItemData(infoBeans); + } + } + + private List convert2ItemData(List infoBeans) { + List dataItems = new ArrayList<>(); + if(null == infoBeans || 0 >= infoBeans.size()){ + return dataItems; + } + + for (UploadMonitorInfoBean infoBean : infoBeans) { + if(null == infoBean || null == infoBean.performanceArray || 0 >= infoBean.performanceArray.size()){ + continue; + } + + PageDataItem item = new PageDataItem(); + + List performanceInfos = infoBean.performanceArray; + item.pageName = infoBean.appName; + + item.upNetWork =new PageDataItemChild<>(R.string.dk_frameinfo_upstream); + item.downNetWork = new PageDataItemChild<>(R.string.dk_frameinfo_downstream); + item.memory = new PageDataItemChild<>(R.string.dk_frameinfo_ram); + item.cpu = new PageDataItemChild<>(R.string.dk_frameinfo_cpu); + item.fps = new PageDataItemChild<>(R.string.dk_frameinfo_fps); + + for (PerformanceInfo info : performanceInfos) { + setValue(item.memory,info.memory); + setValue(item.cpu,info.cpu); + setValue(item.fps,info.fps); + } + + item.memory.avg /= performanceInfos.size(); + item.cpu.avg /= performanceInfos.size(); + item.fps.avg /= performanceInfos.size(); + + dataItems.add(item); + } + + return dataItems; + } + private void setValue(PageDataItemChild child, float newValue) { + child.min = Math.min(null == child.min ? 0:child.min, newValue); + child.max = Math.max(null == child.max ? 0:child.max, newValue); + child.avg = (null == child.avg ? 0:child.avg)+newValue; + } + + private void setValue(PageDataItemChild child, int newValue) { + child.min = Math.min(null == child.min ? 0:child.min, newValue); + child.max = Math.max(null == child.max ? 0:child.max, newValue); + child.avg = (null == child.avg ? 0:child.avg)+newValue; + } + + private void setValue(PageDataItemChild child, double newValue) { + child.min = Math.min(null == child.min ? 0:child.min, newValue); + child.max = Math.max(null == child.max ? 0:child.max, newValue); + child.avg = (null == child.avg ? 0:child.avg)+newValue; + } + + private String getFileString(File file) { + StringBuilder stringBuilder = new StringBuilder(); + if (file.exists()) { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(file)); + String tempString = null; + while ((tempString = reader.readLine()) != null) { + stringBuilder.append(tempString); + } + reader.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } + } + + return stringBuilder.toString(); + } +} diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItem.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItem.java new file mode 100644 index 00000000..b1435793 --- /dev/null +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItem.java @@ -0,0 +1,65 @@ +package com.didichuxing.doraemonkit.kit.custom; + +import android.support.annotation.StringRes; +import android.view.View; + +public class PageDataItem { + public String pageName; + + public PageDataItemChild upNetWork; + public PageDataItemChild downNetWork; + public PageDataItemChild memory; + public PageDataItemChild cpu; + public PageDataItemChild fps; + public PageDataItem() { + } +} + +class PageDataItemChild { + @StringRes + public int nameResId; + public T min; + public T max; + public T avg; + + public PageDataItemChild(int nameResId) { + this.nameResId = nameResId; + } + + public int getVisibility(PageDataItemChild child){ + return 0 < getValue(child.min)+ getValue(child.max) + getValue(child.avg) + ? View.VISIBLE: View.GONE; + } + + private double getValue(Number data){ + return null == data? 0: data.doubleValue(); + } + + public int getNameResId() { + return nameResId; + } + + public void setNameResId(int nameResId) { + this.nameResId = nameResId; + } + + public void setMin(T min) { + this.min = min; + } + + public T getMax() { + return max; + } + + public void setMax(T max) { + this.max = max; + } + + public T getAvg() { + return avg; + } + + public void setAvg(T avg) { + this.avg = avg; + } +} diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItemAdapter.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItemAdapter.java new file mode 100644 index 00000000..958d8059 --- /dev/null +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/PageDataItemAdapter.java @@ -0,0 +1,96 @@ +package com.didichuxing.doraemonkit.kit.custom; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.didichuxing.doraemonkit.R; +import com.didichuxing.doraemonkit.ui.widget.recyclerview.AbsRecyclerAdapter; +import com.didichuxing.doraemonkit.ui.widget.recyclerview.AbsViewBinder; + +public class PageDataItemAdapter extends AbsRecyclerAdapter, PageDataItem> { + private Context mContext; + public PageDataItemAdapter(Context context) { + super(context); + mContext = context; + } + + @Override + protected AbsViewBinder createViewHolder(View view, int viewType) { + return new ViewHolder(view); + } + + @Override + protected View createView(LayoutInflater inflater, ViewGroup parent, int viewType) { + + return inflater.inflate(R.layout.dk_fragment_monitor_pagedata_item, parent, false); + } + + public class ViewHolder extends AbsViewBinder { + private TextView page_name_txt; + private View up_network_item; + private View down_network_item; + private View memory_item; + private View cpu_item; + private View fps_item; + + public ViewHolder(View view) { + super(view); + } + + @Override + protected void getViews() { + page_name_txt = getView(R.id.page_name_txt); + + up_network_item = getView(R.id.up_network_item); + down_network_item = getView(R.id.down_network_item); + memory_item = getView(R.id.memory_item); + cpu_item = getView(R.id.cpu_item); + fps_item = getView(R.id.fps_item); + } + + @Override + public void bind(PageDataItem item) { + page_name_txt.setText(item.pageName); + + setValue(up_network_item, item.upNetWork); + setValue(down_network_item, item.downNetWork); + setValue(memory_item, item.memory); + setValue(cpu_item, item.cpu); + setValue(fps_item, item.fps); + } + } + + private void setValue(View iteView, PageDataItemChild data) { + int visibility = data.getVisibility(data); + iteView.setVisibility(visibility); + if(View.GONE == visibility){ + return; + } + String rule = getFormatRule(data.nameResId); + + ((TextView)iteView.findViewById(R.id.data_name_txt)).setText(data.nameResId); + ((TextView)iteView.findViewById(R.id.high_data_txt)).setText(String.format(rule, data.max)); + ((TextView)iteView.findViewById(R.id.low_data_txt)).setText(String.format(rule, data.min)); + ((TextView)iteView.findViewById(R.id.avg_data_txt)).setText(String.format("%s - "+rule, mContext.getString(R.string.dk_frameinfo_avg_value), data.avg)); + } + + private String getFormatRule(int nameResId){ + String formatRule = ""; + if (nameResId == R.string.dk_frameinfo_ram) { + formatRule = "%.1fM"; + } else if (nameResId == R.string.dk_frameinfo_cpu) { + formatRule = "%.1f%%"; + } else if (nameResId == R.string.dk_frameinfo_fps) { + formatRule = "%s"; + } else if (nameResId == R.string.dk_frameinfo_downstream) { + formatRule = "%.1fB"; + } else if (nameResId == R.string.dk_frameinfo_upstream) { + formatRule = "%.1fB"; + } + + return formatRule; + } +} diff --git a/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/RealTimePerformDataFloatPage.java b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/RealTimePerformDataFloatPage.java new file mode 100644 index 00000000..6bf84ef8 --- /dev/null +++ b/Android/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/custom/RealTimePerformDataFloatPage.java @@ -0,0 +1,162 @@ +package com.didichuxing.doraemonkit.kit.custom; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.TextView; + +import com.didichuxing.doraemonkit.R; +import com.didichuxing.doraemonkit.config.PerformanceInfoConfig; +import com.didichuxing.doraemonkit.kit.common.PerformanceDataManager; +import com.didichuxing.doraemonkit.kit.network.NetworkManager; +import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord; +import com.didichuxing.doraemonkit.kit.timecounter.TimeCounterManager; +import com.didichuxing.doraemonkit.ui.base.BaseFloatPage; +import com.didichuxing.doraemonkit.ui.base.TouchProxy; +import com.didichuxing.doraemonkit.util.UIUtils; + +import java.util.List; + +/** + * + */ + +public class RealTimePerformDataFloatPage extends BaseFloatPage implements TouchProxy.OnTouchEventListener { + public static final int UPDATE_DATA_WHAT = 0x123; + private WindowManager mWindowManager; + private TouchProxy mTouchProxy = new TouchProxy(this); + + TextView mMemoryTxt; + TextView mDownNetworkTxt; + TextView mCpuTxt; + TextView mUpNetworkTxt; + TextView mFpsTxt; + private Handler mHandler; + + @Override + protected void onCreate(Context context) { + super.onCreate(context); + mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + + mHandler = new Handler(Looper.getMainLooper()) { + @Override + public void handleMessage(Message msg) { + showInfo(); + + mHandler.sendEmptyMessageDelayed(UPDATE_DATA_WHAT, 1000); + } + }; + } + + @Override + protected View onCreateView(Context context, ViewGroup view) { + return LayoutInflater.from(context).inflate(R.layout.dk_float_perform_data, null); + } + + @Override + protected void onLayoutParamsCreated(WindowManager.LayoutParams params) { + params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + params.width = WindowManager.LayoutParams.WRAP_CONTENT; + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + params.x = UIUtils.dp2px(getContext(), 30); + params.y = UIUtils.dp2px(getContext(), 30); + } + + @Override + protected void onViewCreated(View view) { + super.onViewCreated(view); + initView(); + } + + private void initView() { + getRootView().setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return mTouchProxy.onTouchEvent(v, event); + } + }); + mMemoryTxt = findViewById(R.id.memory_txt); + mDownNetworkTxt = findViewById(R.id.down_network_txt); + mCpuTxt = findViewById(R.id.cpu_txt); + mUpNetworkTxt = findViewById(R.id.up_network_txt); + mFpsTxt = findViewById(R.id.fps_txt); + + mHandler.sendEmptyMessage(UPDATE_DATA_WHAT); + } + + @SuppressLint("DefaultLocale") + private void showInfo() { + PerformanceDataManager manager = PerformanceDataManager.getInstance(); + if (PerformanceInfoConfig.isMemoryOpen(getContext())) { + mMemoryTxt.setVisibility(View.VISIBLE); + mMemoryTxt.setText(String.format("%s: %.1fM", getString(R.string.dk_frameinfo_ram), manager.getLastMemoryInfo())); + }else{ + mMemoryTxt.setVisibility(View.INVISIBLE); + } + + if (PerformanceInfoConfig.isCPUOpen(getContext())) { + mCpuTxt.setVisibility(View.VISIBLE); + mCpuTxt.setText(String.format("%s: %.1f%%", getString(R.string.dk_frameinfo_cpu), manager.getLastCpuRate())); + }else{ + mCpuTxt.setVisibility(View.INVISIBLE); + } + + if (PerformanceInfoConfig.isFPSOpen(getContext())) { + mFpsTxt.setVisibility(View.VISIBLE); + mFpsTxt.setText(String.format("%s: %s", getString(R.string.dk_frameinfo_fps), manager.getLastFrameRate() + "")); + }else{ + mFpsTxt.setVisibility(View.INVISIBLE); + } + + if (PerformanceInfoConfig.isTrafficOpen(getContext())) { + mDownNetworkTxt.setVisibility(View.VISIBLE); + mUpNetworkTxt.setVisibility(View.VISIBLE); + + List records = NetworkManager.get().getRecords(); + long requestLength = null != records && 0 < records.size() ? records.get(records.size() - 1).requestLength : 0; + long responseLength = null != records && 0 < records.size() ? records.get(records.size() - 1).responseLength : 0; + mDownNetworkTxt.setText(String.format("%s: %sB", getString(R.string.dk_frameinfo_downstream), requestLength)); + mUpNetworkTxt.setText(String.format("%s: %sB", getString(R.string.dk_frameinfo_upstream), responseLength)); + }else{ + mDownNetworkTxt.setVisibility(View.INVISIBLE); + mUpNetworkTxt.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onMove(int x, int y, int dx, int dy) { + getLayoutParams().x += dx; + getLayoutParams().y += dy; + mWindowManager.updateViewLayout(getRootView(), getLayoutParams()); + } + + @Override + public void onUp(int x, int y) { + + } + + @Override + public void onDown(int x, int y) { + + } + + @Override + public void onEnterForeground() { + super.onEnterForeground(); + getRootView().setVisibility(View.VISIBLE); + } + + @Override + public void onEnterBackground() { + super.onEnterBackground(); + getRootView().setVisibility(View.GONE); + TimeCounterManager.get().onEnterBackground(); + } +} \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/drawable-xxhdpi/dk_float_button.png b/Android/doraemonkit/src/main/res/drawable-xxhdpi/dk_float_button.png new file mode 100644 index 0000000000000000000000000000000000000000..19cacba1b8a137bd7a2fdfc6ed0097312509b1ac GIT binary patch literal 11404 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 a>;D7l*d;OgDZG6E0000o}>w2>UN*w)opJ%qo z$^@euIcoYjfg+`ekGkfc)KA`cS4ksko!_PorAh~!SLK;y64xJh zmbN(k>aq~~j(-pP*Bj`~s*O8fd9Av^{067yKJlB5I**yM?>Cg+;L_aZbaB@T(U_#I z%ySZqmsq@&3HA86GV@+B_nahicI)RdK{ZG0?n%8~%Ba3~n#z)jZb3N%F3o%8Pwf~Z XrkKw4UT-S}^dy6)tDnm{r-UW|rLufK literal 0 HcmV?d00001 diff --git a/Android/doraemonkit/src/main/res/drawable/dk_divider_gray.xml b/Android/doraemonkit/src/main/res/drawable/dk_divider_gray.xml new file mode 100644 index 00000000..b57720a3 --- /dev/null +++ b/Android/doraemonkit/src/main/res/drawable/dk_divider_gray.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/drawable/dk_perform_data_background.xml b/Android/doraemonkit/src/main/res/drawable/dk_perform_data_background.xml new file mode 100644 index 00000000..384bcef3 --- /dev/null +++ b/Android/doraemonkit/src/main/res/drawable/dk_perform_data_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/layout/dk_float_perform_data.xml b/Android/doraemonkit/src/main/res/layout/dk_float_perform_data.xml new file mode 100644 index 00000000..88b20cfa --- /dev/null +++ b/Android/doraemonkit/src/main/res/layout/dk_float_perform_data.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata.xml b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata.xml new file mode 100644 index 00000000..db94ef3b --- /dev/null +++ b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata.xml @@ -0,0 +1,25 @@ + + + + + + + + \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item.xml b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item.xml new file mode 100644 index 00000000..012ff699 --- /dev/null +++ b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item_item.xml b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item_item.xml new file mode 100644 index 00000000..db640991 --- /dev/null +++ b/Android/doraemonkit/src/main/res/layout/dk_fragment_monitor_pagedata_item_item.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/doraemonkit/src/main/res/values-en-rUS/strings.xml b/Android/doraemonkit/src/main/res/values-en-rUS/strings.xml index ff3c3114..d30c1a8a 100644 --- a/Android/doraemonkit/src/main/res/values-en-rUS/strings.xml +++ b/Android/doraemonkit/src/main/res/values-en-rUS/strings.xml @@ -52,6 +52,9 @@ FPS CPU CUSTOM + Upstream traffic + Downstream traffic + Average value Enter the keywords you want to filter Verbose @@ -167,6 +170,8 @@ start test stop test + view statistics + page data Loading... diff --git a/Android/doraemonkit/src/main/res/values-zh-rCN/strings.xml b/Android/doraemonkit/src/main/res/values-zh-rCN/strings.xml index 7f475008..79fa8ced 100644 --- a/Android/doraemonkit/src/main/res/values-zh-rCN/strings.xml +++ b/Android/doraemonkit/src/main/res/values-zh-rCN/strings.xml @@ -53,6 +53,9 @@ 帧率 CPU 自定义 + 上行流量 + 下行流量 + 平均值 输入想要过滤的关键字 Verbose @@ -166,5 +169,7 @@ 开始测试 结束测试 + 查看统计数据 + 页面数据 日志加载中... diff --git a/Android/doraemonkit/src/main/res/values/strings.xml b/Android/doraemonkit/src/main/res/values/strings.xml index ac5ebc63..3599ffdc 100644 --- a/Android/doraemonkit/src/main/res/values/strings.xml +++ b/Android/doraemonkit/src/main/res/values/strings.xml @@ -56,6 +56,9 @@ CPU 内存 自定义 + 上行流量 + 下行流量 + 平均值 输入想要过滤的关键字 Verbose @@ -179,6 +182,8 @@ 开始测试 结束测试 + 查看统计数据 + 页面数据 日志加载中... -- GitLab