From 7c053ccdda68b23a70afded7e9ca7388c0065ca0 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Sun, 27 Aug 2017 23:35:08 -0600 Subject: [PATCH 01/18] upgrade studio to 2.3.3 and constraint-layout to 1.0.2 --- build.gradle | 2 +- sample/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 9b9f3b2..ebd7442 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:2.3.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/sample/build.gradle b/sample/build.gradle index 5327112..4aeed43 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -66,7 +66,7 @@ dependencies { testCompile project(':debugoverlay-no-op') compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4' + compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:design:25.3.1' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' From 7a96602436c0cb8559c222c678553e9c38147787 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Sun, 27 Aug 2017 23:58:14 -0600 Subject: [PATCH 02/18] add % for cpu usage module display unit --- .../com/ms_square/debugoverlay/modules/CpuUsageViewModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java index 68d6460..d213874 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java @@ -44,7 +44,7 @@ public void onDataAvailable(CpuUsage data) { } if (cpuUsageTextView != null) { - StringBuilder builder = new StringBuilder("cpu: "); + StringBuilder builder = new StringBuilder("cpu(%): "); cpuUsageTextView.setText(builder.append(totalCpuUsage).append(" ").append(myPidCpuUsage).toString()); } } From 6666673c722f14be959af3010e5ddfd8666ea38a Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Tue, 29 Aug 2017 00:59:28 -0600 Subject: [PATCH 03/18] bump sdk and other lib versions to target O --- build.gradle | 3 +++ debugoverlay/build.gradle | 12 ++++++------ sample/build.gradle | 10 +++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index ebd7442..5f51285 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,9 @@ buildscript { allprojects { repositories { jcenter() + maven { + url "https://maven.google.com" + } } } diff --git a/debugoverlay/build.gradle b/debugoverlay/build.gradle index dd533d7..c708b59 100644 --- a/debugoverlay/build.gradle +++ b/debugoverlay/build.gradle @@ -3,12 +3,12 @@ apply plugin: 'com.android.library' apply plugin: 'com.getkeepsafe.dexcount' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { minSdkVersion 16 - targetSdkVersion 25 + targetSdkVersion 26 } // force usage of prefix to avoid naming conflicts @@ -29,9 +29,9 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:support-compat:25.3.1' - compile 'com.android.support:support-core-utils:25.3.1' - compile 'com.android.support:support-annotations:25.3.1' + compile 'com.android.support:support-compat:26.0.1' + compile 'com.android.support:support-core-utils:26.0.1' + compile 'com.android.support:support-annotations:26.0.1' } // for maven central deployment diff --git a/sample/build.gradle b/sample/build.gradle index 4aeed43..47f160c 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -14,12 +14,12 @@ def gitHash() { } android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { applicationId "com.ms_square.debugoverlay.sample" minSdkVersion 16 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName "1.0.0" @@ -65,9 +65,9 @@ dependencies { releaseCompile project(':debugoverlay-no-op') testCompile project(':debugoverlay-no-op') - compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:appcompat-v7:26.0.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' - compile 'com.android.support:design:25.3.1' + compile 'com.android.support:design:26.0.1' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' From 27562b577152002bd2d84104e2f8bdd16154ded7 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Tue, 29 Aug 2017 01:05:25 -0600 Subject: [PATCH 04/18] Use TYPE_APPLICATION_OVERLAY as a window type for Android O and above #9 --- .../java/com/ms_square/debugoverlay/OverlayViewManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java index 4e29f3e..bf990e2 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java @@ -26,6 +26,7 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; @@ -237,7 +238,9 @@ public static boolean isSystemLayer(int windowType) { public static int getWindowTypeForOverlay(boolean allowSystemLayer) { if (allowSystemLayer) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + return TYPE_APPLICATION_OVERLAY; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { return TYPE_SYSTEM_ALERT; } else { return TYPE_TOAST; From 3614fb1f51079dc19c5972f13dc7ae825880fb82 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Tue, 29 Aug 2017 23:24:00 -0600 Subject: [PATCH 05/18] add a notification channel for Android O #12 --- .../debugoverlay/DebugOverlayService.java | 19 +++++++++++++++++-- debugoverlay/src/main/res/values/strings.xml | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java index c4c3227..c33e6e2 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java @@ -1,5 +1,6 @@ package com.ms_square.debugoverlay; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -13,6 +14,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -27,7 +29,8 @@ public class DebugOverlayService extends Service { private static final String TAG = DebugOverlayService.class.getSimpleName(); - private static final int NOTIFICATION_ID = 10000; + private static final String NOTIFICATION_CHANNEL_ID = "com.ms_square.debugoverlay"; + private static final int NOTIFICATION_ID = Integer.MAX_VALUE - 100; private static final String ACTION_SHOW_SUFFIX = ".debugoverlay_ACTION_SHOW"; private static final String ACTION_HIDE_SUFFIX = ".debugoverlay_ACTION_HIDE"; @@ -65,6 +68,8 @@ public void onCreate() { } notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); + createNotificationChannel(); + String packageName = getPackageName(); actionShow = packageName + ACTION_SHOW_SUFFIX; actionHide = packageName + ACTION_HIDE_SUFFIX; @@ -156,8 +161,18 @@ public void updateNotification() { showNotification(); } + private void createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + if (notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) { + NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, + getString(R.string.debugoverlay_notification_channel_name), NotificationManager.IMPORTANCE_LOW); + notificationManager.createNotificationChannel(channel); + } + } + } + private void showNotification() { - NotificationCompat.Builder builder = new NotificationCompat.Builder(this) + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) .setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.debugoverlay_notification_big_text))) .setSmallIcon(R.drawable.debugoverlay_ic_notification) .setLargeIcon(getAppIcon(this)) diff --git a/debugoverlay/src/main/res/values/strings.xml b/debugoverlay/src/main/res/values/strings.xml index c5692b2..72b9606 100644 --- a/debugoverlay/src/main/res/values/strings.xml +++ b/debugoverlay/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ + DebugOverlay %1$s:%2$s Control DebugOverlay Control DebugOverlay From 8947f1f5223a85698906ee51a438ee38432e7d70 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Tue, 29 Aug 2017 23:30:55 -0600 Subject: [PATCH 06/18] update log tags to use just strings --- .../src/main/java/com/ms_square/debugoverlay/DebugOverlay.java | 2 +- .../java/com/ms_square/debugoverlay/DebugOverlayService.java | 2 +- .../java/com/ms_square/debugoverlay/OverlayViewManager.java | 2 +- .../com/ms_square/debugoverlay/modules/CpuUsageDataModule.java | 2 +- .../com/ms_square/debugoverlay/modules/CpuUsageViewModule.java | 2 +- .../com/ms_square/debugoverlay/modules/LogcatDataModule.java | 2 +- .../java/com/ms_square/debugoverlay/modules/LogcatLine.java | 2 +- .../com/ms_square/debugoverlay/modules/LogcatViewModule.java | 2 +- .../com/ms_square/debugoverlay/modules/MemInfoViewModule.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java index 23dd705..ad5e26d 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java @@ -32,7 +32,7 @@ public class DebugOverlay { - private static final String TAG = DebugOverlay.class.getSimpleName(); + private static final String TAG = "DebugOverlay"; public static final Position DEFAULT_POSITION = Position.BOTTOM_START; public static final int DEFAULT_BG_COLOR = Color.parseColor("#40000000"); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java index c33e6e2..055d07f 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlayService.java @@ -27,7 +27,7 @@ public class DebugOverlayService extends Service { - private static final String TAG = DebugOverlayService.class.getSimpleName(); + private static final String TAG = "DebugOverlayService"; private static final String NOTIFICATION_CHANNEL_ID = "com.ms_square.debugoverlay"; private static final int NOTIFICATION_ID = Integer.MAX_VALUE - 100; diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java index bf990e2..f8900db 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayViewManager.java @@ -32,7 +32,7 @@ class OverlayViewManager { - private static final String TAG = OverlayViewManager.class.getSimpleName(); + private static final String TAG = "OverlayViewManager"; private final Context context; private final DebugOverlay.Config config; diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java index 97c9495..bda654e 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java @@ -13,7 +13,7 @@ class CpuUsageDataModule extends BaseDataModule { - private static final String TAG = CpuUsageDataModule.class.getSimpleName(); + private static final String TAG = "CpuUsageDataModule"; private final Handler handler = new Handler(Looper.getMainLooper()); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java index d213874..580c9f0 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java @@ -17,7 +17,7 @@ public class CpuUsageViewModule extends BaseViewModule { - private static final String TAG = CpuUsageViewModule.class.getSimpleName(); + private static final String TAG = "CpuUsageViewModule"; private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.0", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatDataModule.java index 7ad7948..7e5f3f5 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatDataModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatDataModule.java @@ -13,7 +13,7 @@ class LogcatDataModule extends BaseDataModule { - private static final String TAG = LogcatDataModule.class.getSimpleName(); + private static final String TAG = "LogcatDataModule"; private static final int LINE_UPDATED = 10000; diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatLine.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatLine.java index 0db58b3..cf8387e 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatLine.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatLine.java @@ -11,7 +11,7 @@ */ public class LogcatLine { - private static final String TAG = LogcatLine.class.getSimpleName(); + private static final String TAG = "LogcatLine"; public enum Priority { diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java index 6ea7f7e..1d0f3da 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java @@ -20,7 +20,7 @@ public class LogcatViewModule extends BaseViewModule { - private static final String TAG = LogcatViewModule.class.getSimpleName(); + private static final String TAG = "LogcatViewModule"; private final int maxLines; diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java index 23264a3..6849da3 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java @@ -22,7 +22,7 @@ public class MemInfoViewModule extends BaseViewModule { - private static final String TAG = MemInfoViewModule.class.getSimpleName(); + private static final String TAG = "MemInfoViewModule"; private static final String HEADER = "memory(mb):\n"; From 0e43a35f6de5d7eb44993bed4444dafee5cdf8da Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Wed, 30 Aug 2017 00:11:42 -0600 Subject: [PATCH 07/18] deprecate CpuUsageModule since it does not work on Android O and above #11 --- .../com/ms_square/debugoverlay/DebugOverlay.java | 13 +++++++++++++ .../debugoverlay/modules/CpuUsageDataModule.java | 5 +++++ .../debugoverlay/modules/CpuUsageModule.java | 5 +++++ 3 files changed, 23 insertions(+) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java index ad5e26d..b900da7 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java @@ -9,6 +9,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.Parcel; @@ -26,6 +27,7 @@ import com.ms_square.debugoverlay.modules.MemInfoModule; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.WeakHashMap; @@ -302,6 +304,17 @@ public DebugOverlay build() { overlayModules.add(new MemInfoModule(application)); overlayModules.add(new FpsModule()); } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // Removes any CpuUsageModule if a device is running Android O and above + Iterator iterator = overlayModules.iterator(); + while (iterator.hasNext()) { + if (iterator.next() instanceof CpuUsageModule) { + iterator.remove(); + } + } + } + return new DebugOverlay(application, overlayModules, new Config(position, bgColor, textColor, textSize, textAlpha, allowSystemLayer, showNotification, activityName)); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java index bda654e..4006a09 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageDataModule.java @@ -1,5 +1,6 @@ package com.ms_square.debugoverlay.modules; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Process; @@ -27,6 +28,10 @@ public CpuUsageDataModule(int interval) { @Override public void start() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Log.w(TAG, "CpuUsageModule is not supported on Android O and above and will be no-op."); + return; + } if (cpuReaderThread == null) { cpuReaderThread = new ReaderThread(); cpuReaderThread.start(); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageModule.java index 5f5edf5..d29f0a2 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageModule.java @@ -6,6 +6,11 @@ import com.ms_square.debugoverlay.OverlayModule; import com.ms_square.debugoverlay.ViewModule; +/** + * @deprecated will not work on Android O and above. + * For details, @see this issue + */ +@Deprecated public class CpuUsageModule extends OverlayModule { public static final int DEFAULT_INTERVAL = 1000; // 1000ms From ae3abc15471fbe0ee78895466fd01b2b93d24921 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 00:40:28 -0600 Subject: [PATCH 08/18] add CpuFreqModule to display currrent/max cpu frequencies --- .../debugoverlay/modules/CpuFreq.java | 46 +++++ .../modules/CpuFreqDataModule.java | 157 ++++++++++++++++++ .../debugoverlay/modules/CpuFreqModule.java | 39 +++++ .../modules/CpuFreqViewModule.java | 48 ++++++ .../main/res/layout/debugoverlay_cpu_freq.xml | 8 + 5 files changed, 298 insertions(+) create mode 100644 debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java create mode 100644 debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java create mode 100644 debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java create mode 100644 debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java create mode 100644 debugoverlay/src/main/res/layout/debugoverlay_cpu_freq.xml diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java new file mode 100644 index 0000000..4295fc4 --- /dev/null +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java @@ -0,0 +1,46 @@ +package com.ms_square.debugoverlay.modules; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; + +public class CpuFreq { + + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.00", + DecimalFormatSymbols.getInstance(Locale.ENGLISH)); + + private final String cpuName; + private final double minFreq; + private final double curFreq; + private final double maxFreq; + + public CpuFreq(String cpuName, double minFreq, double curFreq, double maxFreq) { + this.cpuName = cpuName; + this.minFreq = minFreq; + this.curFreq = curFreq; + this.maxFreq = maxFreq; + } + + public String getCpuName() { + return cpuName; + } + + public double getMinFreq() { + return minFreq; + } + + public double getCurFreq() { + return curFreq; + } + + public double getMaxFreq() { + return maxFreq; + } + + @Override + public String toString() { + return String.format(Locale.US, "%s(GHz): %s/%s ", cpuName, + DECIMAL_FORMAT.format(curFreq / 1000000f), + DECIMAL_FORMAT.format(maxFreq / 1000000f)); + } +} diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java new file mode 100644 index 0000000..da90cea --- /dev/null +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java @@ -0,0 +1,157 @@ +package com.ms_square.debugoverlay.modules; + +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.ms_square.debugoverlay.DebugOverlay; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Pattern; + +import static java.lang.Double.parseDouble; + +public class CpuFreqDataModule extends BaseDataModule> { + + private static final String TAG = "CpuFreqDataModule"; + + private final Handler handler = new Handler(Looper.getMainLooper()); + + private final AtomicReference> cpuFreqList = new AtomicReference<>(); + + private final Runnable notifyObserversRunnable = new Runnable() { + @Override + public void run() { + notifyObservers(); + } + }; + + /** + * The cpufreq values are given in kHz. + * https://www.kernel.org/doc/Documentation/cpu-freq/user-guide.txt + */ + private final Runnable cpuFreqReadRunnable = new Runnable() { + + Map cachedFrequencies = new LinkedHashMap<>(); + + @Override + public void run() { + if (cachedFrequencies.isEmpty()) { + File[] cpuFiles = getCpuFiles(); + if (cpuFiles != null) { + for (File cpuFile : cpuFiles) { + try { + BufferedReader minFreqReader = + new BufferedReader(new FileReader(cpuFile.getAbsolutePath() + "/cpufreq/cpuinfo_min_freq")); + BufferedReader maxFreqReader = + new BufferedReader(new FileReader(cpuFile.getAbsolutePath() + "/cpufreq/cpuinfo_max_freq")); + double minFreq = parseDouble(minFreqReader.readLine()); + double maxFreq = parseDouble(maxFreqReader.readLine()); + + if (DebugOverlay.isDebugLoggingEnabled()) { + Log.d(TAG, cpuFile.getName() + " minFreq(kHz):" + minFreq); + Log.d(TAG, cpuFile.getName() + " maxFreq(kHz):" + maxFreq); + } + + cachedFrequencies.put(cpuFile, new CpuFreq(cpuFile.getName(), minFreq, -1f, maxFreq)); + } catch (IOException ie) { + Log.w(TAG, "Error reading the min/max cpufreq", ie); + } + } + } + } + + List newCpuFreqList = new ArrayList<>(); + + for (File cpuFile : cachedFrequencies.keySet()) { + CpuFreq cached = cachedFrequencies.get(cpuFile); + double curFreq = -1f; + try { + BufferedReader curFreqReader = new BufferedReader(new FileReader(cpuFile.getAbsolutePath() + "/cpufreq/scaling_cur_freq")); + curFreq = parseDouble(curFreqReader.readLine()); + + if (DebugOverlay.isDebugLoggingEnabled()) { + Log.d(TAG, cpuFile.getName() + " curFreq(kHz):" + curFreq); + } + + } catch (IOException ie) { + Log.w(TAG, "Error reading the current cpufreq", ie); + } + + newCpuFreqList.add(new CpuFreq(cached.getCpuName(), cached.getMinFreq(), curFreq, cached.getMaxFreq())); + } + + cpuFreqList.set(Collections.unmodifiableList(newCpuFreqList)); + + handler.post(notifyObserversRunnable); + } + }; + + private ScheduledExecutorService executorService; + + public CpuFreqDataModule(int interval) { + super(interval); + } + + @Override + public void start() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Log.w(TAG, "CpuFreqDataModule is not supported on Android O and above and will be no-op."); + return; + } + if (executorService == null) { + executorService = Executors.newSingleThreadScheduledExecutor(); + executorService.scheduleWithFixedDelay(cpuFreqReadRunnable, 0, getInterval(), TimeUnit.MILLISECONDS); + } + } + + @Override + public void stop() { + handler.removeCallbacks(notifyObserversRunnable); + if (executorService != null) { + executorService.shutdown(); + try { + if (!executorService.awaitTermination(1000, TimeUnit.MILLISECONDS)) { + Log.w(TAG, "ExecutorService did not terminate"); + } + } catch (InterruptedException ie) { + // Preserve interrupt status + Thread.currentThread().interrupt(); + } + executorService = null; + } + } + + @Override + protected List getLatestData() { + return cpuFreqList.get(); + } + + private static File[] getCpuFiles() { + File dir = new File("/sys/devices/system/cpu/"); + File[] files = dir.listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + if(Pattern.matches("cpu[0-9]+", file.getName())) { + return true; + } + return false; + } + }); + return files; + } +} diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java new file mode 100644 index 0000000..3511d81 --- /dev/null +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java @@ -0,0 +1,39 @@ +package com.ms_square.debugoverlay.modules; + +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; + +import com.ms_square.debugoverlay.OverlayModule; +import com.ms_square.debugoverlay.ViewModule; + +import java.util.List; + +/** + * @deprecated will not work on Android O and above. + * @see this issue for its background. + */ +@Deprecated +public class CpuFreqModule extends OverlayModule> { + + public static final int DEFAULT_INTERVAL = 2000; // 2000ms + + public CpuFreqModule() { + super(new CpuFreqDataModule(DEFAULT_INTERVAL), new CpuFreqViewModule()); + } + + public CpuFreqModule(int interval) { + super(new CpuFreqDataModule(interval), new CpuFreqViewModule()); + } + + public CpuFreqModule(int interval, @LayoutRes int layoutResId) { + super(new CpuFreqDataModule(interval), new CpuFreqViewModule(layoutResId)); + } + + public CpuFreqModule(@NonNull ViewModule> viewModule) { + super(new CpuFreqDataModule(DEFAULT_INTERVAL), viewModule); + } + + public CpuFreqModule(int interval, @NonNull ViewModule> viewModule) { + super(new CpuFreqDataModule(interval), viewModule); + } +} diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java new file mode 100644 index 0000000..9909be2 --- /dev/null +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java @@ -0,0 +1,48 @@ +package com.ms_square.debugoverlay.modules; + +import android.support.annotation.ColorInt; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.ms_square.debugoverlay.R; + +import java.util.List; + +public class CpuFreqViewModule extends BaseViewModule> { + + private TextView cpuFreqTextView; + + public CpuFreqViewModule() { + super(R.layout.debugoverlay_cpu_freq); + } + + public CpuFreqViewModule(@LayoutRes int layoutResId) { + super(layoutResId); + } + + @Override + public void onDataAvailable(List cpuFreqList) { + if (cpuFreqList != null && cpuFreqTextView != null) { + StringBuilder builder = new StringBuilder(); + for (CpuFreq cpuFreq : cpuFreqList) { + builder.append(cpuFreq.toString()).append("\n"); + } + cpuFreqTextView.setText(builder.toString()); + } + } + + @NonNull + @Override + public View createView(@NonNull ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) { + View view = LayoutInflater.from(root.getContext()).inflate(layoutResId, root, false); + cpuFreqTextView = view.findViewById(R.id.debugoverlay_overlay_text); + cpuFreqTextView.setTextColor(textColor); + cpuFreqTextView.setTextSize(textSize); + cpuFreqTextView.setAlpha(textAlpha); + return view; + } +} diff --git a/debugoverlay/src/main/res/layout/debugoverlay_cpu_freq.xml b/debugoverlay/src/main/res/layout/debugoverlay_cpu_freq.xml new file mode 100644 index 0000000..a0b31bd --- /dev/null +++ b/debugoverlay/src/main/res/layout/debugoverlay_cpu_freq.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file From 957080a131ae7ad90b4cd6bbe636c845499b4d4d Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 00:44:47 -0600 Subject: [PATCH 09/18] fix not to start CpuFreqModule in Android O and above --- .../main/java/com/ms_square/debugoverlay/DebugOverlay.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java index b900da7..6154138 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/DebugOverlay.java @@ -22,6 +22,7 @@ import android.support.v4.content.LocalBroadcastManager; import android.util.Log; +import com.ms_square.debugoverlay.modules.CpuFreqModule; import com.ms_square.debugoverlay.modules.CpuUsageModule; import com.ms_square.debugoverlay.modules.FpsModule; import com.ms_square.debugoverlay.modules.MemInfoModule; @@ -306,10 +307,11 @@ public DebugOverlay build() { } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - // Removes any CpuUsageModule if a device is running Android O and above + // Removes any CpuUsageModule/CpuFreqModule if a device is running Android O and above Iterator iterator = overlayModules.iterator(); while (iterator.hasNext()) { - if (iterator.next() instanceof CpuUsageModule) { + OverlayModule overlayModule = iterator.next(); + if (overlayModule instanceof CpuUsageModule || overlayModule instanceof CpuFreqModule) { iterator.remove(); } } From 5ca732966138ecbb300bf2a179a91222bb920fc5 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 00:47:52 -0600 Subject: [PATCH 10/18] minor fixes --- .../ms_square/debugoverlay/modules/CpuUsageViewModule.java | 2 +- .../com/ms_square/debugoverlay/modules/FpsViewModule.java | 2 +- .../ms_square/debugoverlay/modules/LogcatViewModule.java | 6 +++--- .../ms_square/debugoverlay/modules/MemInfoViewModule.java | 2 +- debugoverlay/src/main/res/layout/debugoverlay_cpu_usage.xml | 1 + 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java index 580c9f0..1869e72 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuUsageViewModule.java @@ -53,7 +53,7 @@ public void onDataAvailable(CpuUsage data) { @Override public View createView(ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) { View view = LayoutInflater.from(root.getContext()).inflate(layoutResId, root, false); - cpuUsageTextView = (TextView) view.findViewById(R.id.debugoverlay_overlay_text); + cpuUsageTextView = view.findViewById(R.id.debugoverlay_overlay_text); cpuUsageTextView.setTextColor(textColor); cpuUsageTextView.setTextSize(textSize); cpuUsageTextView.setAlpha(textAlpha); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/FpsViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/FpsViewModule.java index e29fd69..8d795d2 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/FpsViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/FpsViewModule.java @@ -38,7 +38,7 @@ public void onDataAvailable(Double data) { @Override public View createView(ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) { View view = LayoutInflater.from(root.getContext()).inflate(layoutResId, root, false); - fpsTxtView = (TextView) view.findViewById(R.id.debugoverlay_overlay_text); + fpsTxtView = view.findViewById(R.id.debugoverlay_overlay_text); fpsTxtView.setTextColor(textColor); fpsTxtView.setTextSize(textSize); fpsTxtView.setAlpha(textAlpha); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java index 1d0f3da..8bf24b3 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/LogcatViewModule.java @@ -126,9 +126,9 @@ public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.debugoverlay_line_logcat, parent, false); - TextView dateAndTime = (TextView) convertView.findViewById(R.id.date_and_time); - TextView priorityAndTag = (TextView) convertView.findViewById(R.id.priority_and_tag); - TextView message = (TextView) convertView.findViewById(R.id.message); + TextView dateAndTime = convertView.findViewById(R.id.date_and_time); + TextView priorityAndTag = convertView.findViewById(R.id.priority_and_tag); + TextView message = convertView.findViewById(R.id.message); dateAndTime.setTextColor(textColor); diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java index 6849da3..e7c5105 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/MemInfoViewModule.java @@ -74,7 +74,7 @@ public void onDataAvailable(MemInfo data) { @Override public View createView(ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) { View view = LayoutInflater.from(root.getContext()).inflate(layoutResId, root, false); - memInfoTxtView = (TextView) view.findViewById(R.id.debugoverlay_overlay_text); + memInfoTxtView = view.findViewById(R.id.debugoverlay_overlay_text); memInfoTxtView.setTextColor(textColor); memInfoTxtView.setTextSize(textSize); memInfoTxtView.setAlpha(textAlpha); diff --git a/debugoverlay/src/main/res/layout/debugoverlay_cpu_usage.xml b/debugoverlay/src/main/res/layout/debugoverlay_cpu_usage.xml index 59171c9..80166a1 100644 --- a/debugoverlay/src/main/res/layout/debugoverlay_cpu_usage.xml +++ b/debugoverlay/src/main/res/layout/debugoverlay_cpu_usage.xml @@ -2,6 +2,7 @@ \ No newline at end of file From e8e0ec4f58033f138a7e7a704975b651b8b69797 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 21:48:15 -0600 Subject: [PATCH 11/18] fix to display as NA if cpu frequency is not available (ex...file not found or permission denied) --- .../java/com/ms_square/debugoverlay/modules/CpuFreq.java | 4 ++-- .../debugoverlay/modules/CpuFreqDataModule.java | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java index 4295fc4..68207df 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java @@ -40,7 +40,7 @@ public double getMaxFreq() { @Override public String toString() { return String.format(Locale.US, "%s(GHz): %s/%s ", cpuName, - DECIMAL_FORMAT.format(curFreq / 1000000f), - DECIMAL_FORMAT.format(maxFreq / 1000000f)); + curFreq >= 0 ? DECIMAL_FORMAT.format(curFreq / 1000000f) : "NA", + maxFreq >= 0 ? DECIMAL_FORMAT.format(maxFreq / 1000000f) : "NA"); } } diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java index da90cea..5838375 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java @@ -54,23 +54,24 @@ public void run() { File[] cpuFiles = getCpuFiles(); if (cpuFiles != null) { for (File cpuFile : cpuFiles) { + double minFreq = -1f; + double maxFreq = -1f; try { BufferedReader minFreqReader = new BufferedReader(new FileReader(cpuFile.getAbsolutePath() + "/cpufreq/cpuinfo_min_freq")); BufferedReader maxFreqReader = new BufferedReader(new FileReader(cpuFile.getAbsolutePath() + "/cpufreq/cpuinfo_max_freq")); - double minFreq = parseDouble(minFreqReader.readLine()); - double maxFreq = parseDouble(maxFreqReader.readLine()); + minFreq = parseDouble(minFreqReader.readLine()); + maxFreq = parseDouble(maxFreqReader.readLine()); if (DebugOverlay.isDebugLoggingEnabled()) { Log.d(TAG, cpuFile.getName() + " minFreq(kHz):" + minFreq); Log.d(TAG, cpuFile.getName() + " maxFreq(kHz):" + maxFreq); } - - cachedFrequencies.put(cpuFile, new CpuFreq(cpuFile.getName(), minFreq, -1f, maxFreq)); } catch (IOException ie) { Log.w(TAG, "Error reading the min/max cpufreq", ie); } + cachedFrequencies.put(cpuFile, new CpuFreq(cpuFile.getName(), minFreq, -1f, maxFreq)); } } } From 473110c6ff4fd194d40f94095e7085655a424943 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 22:27:27 -0600 Subject: [PATCH 12/18] update no-op version --- debugoverlay-no-op/build.gradle | 6 ++-- .../debugoverlay/modules/CpuFreq.java | 23 ++++++++++++++ .../debugoverlay/modules/CpuFreqModule.java | 31 +++++++++++++++++++ .../modules/CpuFreqViewModule.java | 26 ++++++++++++++++ .../debugoverlay/DebugOverlayNoOpTest.java | 14 ++++++++- 5 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java create mode 100644 debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java create mode 100644 debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java diff --git a/debugoverlay-no-op/build.gradle b/debugoverlay-no-op/build.gradle index 1f32e28..b525f63 100644 --- a/debugoverlay-no-op/build.gradle +++ b/debugoverlay-no-op/build.gradle @@ -3,12 +3,12 @@ apply plugin: 'com.android.library' apply plugin: 'com.getkeepsafe.dexcount' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 26 + buildToolsVersion "26.0.1" defaultConfig { minSdkVersion 16 - targetSdkVersion 25 + targetSdkVersion 26 } // force usage of prefix to avoid naming conflicts, diff --git a/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java new file mode 100644 index 0000000..6c5f489 --- /dev/null +++ b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreq.java @@ -0,0 +1,23 @@ +package com.ms_square.debugoverlay.modules; + +public class CpuFreq { + + public CpuFreq(String cpuName, double minFreq, double curFreq, double maxFreq) { + } + + public String getCpuName() { + return null; + } + + public double getMinFreq() { + return 0f; + } + + public double getCurFreq() { + return 0f; + } + + public double getMaxFreq() { + return 0f; + } +} diff --git a/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java new file mode 100644 index 0000000..57d9b4a --- /dev/null +++ b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqModule.java @@ -0,0 +1,31 @@ +package com.ms_square.debugoverlay.modules; + +import com.ms_square.debugoverlay.OverlayModule; +import com.ms_square.debugoverlay.ViewModule; + +import java.util.List; + +public class CpuFreqModule extends OverlayModule> { + + public static final int DEFAULT_INTERVAL = 2000; // 2000ms + + public CpuFreqModule() { + super(null, null); + } + + public CpuFreqModule(int interval) { + super(null, null); + } + + public CpuFreqModule(int interval, int layoutResId) { + super(null, null); + } + + public CpuFreqModule(ViewModule> viewModule) { + super(null, null); + } + + public CpuFreqModule(int interval, ViewModule> viewModule) { + super(null, null); + } +} diff --git a/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java new file mode 100644 index 0000000..d2c368c --- /dev/null +++ b/debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java @@ -0,0 +1,26 @@ +package com.ms_square.debugoverlay.modules; + +import android.view.View; +import android.view.ViewGroup; + +import java.util.List; + +public class CpuFreqViewModule extends BaseViewModule> { + + public CpuFreqViewModule() { + super(0); + } + + public CpuFreqViewModule(int layoutResId) { + super(layoutResId); + } + + @Override + public void onDataAvailable(List cpuFreqList) { + } + + @Override + public View createView(ViewGroup root, int textColor, float textSize, float textAlpha) { + return null; + } +} diff --git a/debugoverlay-no-op/src/test/java/com/ms_square/debugoverlay/DebugOverlayNoOpTest.java b/debugoverlay-no-op/src/test/java/com/ms_square/debugoverlay/DebugOverlayNoOpTest.java index a409dcb..ebd941e 100644 --- a/debugoverlay-no-op/src/test/java/com/ms_square/debugoverlay/DebugOverlayNoOpTest.java +++ b/debugoverlay-no-op/src/test/java/com/ms_square/debugoverlay/DebugOverlayNoOpTest.java @@ -3,6 +3,7 @@ import android.app.Application; import android.graphics.Color; +import com.ms_square.debugoverlay.modules.CpuFreqModule; import com.ms_square.debugoverlay.modules.CpuUsageModule; import com.ms_square.debugoverlay.modules.FpsModule; import com.ms_square.debugoverlay.modules.LogcatLine; @@ -38,7 +39,7 @@ public class DebugOverlayNoOpTest { OverlayModule mockOverlayModule; @Test - public void cpuModuleConstructors() { + public void cpuUsageModuleConstructors() { new CpuUsageModule(); new CpuUsageModule(0); new CpuUsageModule(0, 0); @@ -48,6 +49,17 @@ public void cpuModuleConstructors() { Mockito.verifyZeroInteractions(mockViewModule); } + @Test + public void cpuFreqModuleConstructors() { + new CpuFreqModule(); + new CpuFreqModule(0); + new CpuFreqModule(0, 0); + new CpuFreqModule(mockViewModule); + new CpuFreqModule(0, mockViewModule); + + Mockito.verifyZeroInteractions(mockViewModule); + } + @Test public void fpsModuleConstructors() { new FpsModule(); From 352365191b4a91994556abedc1dfcc35356e8335 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 22:27:55 -0600 Subject: [PATCH 13/18] make CpuFreqDataModule package private --- .../com/ms_square/debugoverlay/modules/CpuFreqDataModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java index 5838375..0d8b2be 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqDataModule.java @@ -25,7 +25,7 @@ import static java.lang.Double.parseDouble; -public class CpuFreqDataModule extends BaseDataModule> { +class CpuFreqDataModule extends BaseDataModule> { private static final String TAG = "CpuFreqDataModule"; From e39a827e842017f1483a698443469192173cb93a Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 22:37:51 -0600 Subject: [PATCH 14/18] fix not to add line separator for the last item --- .../ms_square/debugoverlay/modules/CpuFreqViewModule.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java index 9909be2..7ccfc96 100644 --- a/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java +++ b/debugoverlay/src/main/java/com/ms_square/debugoverlay/modules/CpuFreqViewModule.java @@ -29,7 +29,10 @@ public void onDataAvailable(List cpuFreqList) { if (cpuFreqList != null && cpuFreqTextView != null) { StringBuilder builder = new StringBuilder(); for (CpuFreq cpuFreq : cpuFreqList) { - builder.append(cpuFreq.toString()).append("\n"); + if (builder.length() > 0) { + builder.append("\n"); + } + builder.append(cpuFreq.toString()); } cpuFreqTextView.setText(builder.toString()); } From 396b014206b7cb0a1e6201bda17c18cdd02f9d43 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Fri, 1 Sep 2017 22:49:58 -0600 Subject: [PATCH 15/18] update a sample application to include a commented-out example of using CpuFreqModule --- .../debugoverlay/sample/DebugOverlaySampleApplication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sample/src/main/java/com/ms_square/debugoverlay/sample/DebugOverlaySampleApplication.java b/sample/src/main/java/com/ms_square/debugoverlay/sample/DebugOverlaySampleApplication.java index e28d478..b183c33 100644 --- a/sample/src/main/java/com/ms_square/debugoverlay/sample/DebugOverlaySampleApplication.java +++ b/sample/src/main/java/com/ms_square/debugoverlay/sample/DebugOverlaySampleApplication.java @@ -41,7 +41,8 @@ public void onCreate() { // Use custom module // new DebugOverlay.Builder(this) -// .modules(new CpuUsageModule(), +// .modules(new CpuFreqModule(), +// new CpuUsageModule(), // new MemInfoModule(this), // new FpsModule(), // new IPAddressModule(this)) From c90062e0bb1acfe3f2a6157477567c69d5a36413 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Sat, 2 Sep 2017 00:40:09 -0600 Subject: [PATCH 16/18] update docs for v1.1.0 --- CHANGELOG.md | 6 ++++ README.md | 31 +++++++++++------- ...y_with_custom_module_and_cpufreq_small.png | Bin 0 -> 81720 bytes 3 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 art/overlay_with_custom_module_and_cpufreq_small.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 5743996..14f64d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## Version 1.1.0 *(2017-09-01)* + +* Android O support (Note: CpuUsageModule/CpuFreqModule will not work on Android O and above) +* Add a CpuFreqModule to show current/max frequencies of all the cpu cores +* Support Library 25.3.1 -> 26.0.1 + ## Version 1.0.1 *(2017-04-05)* * Use split v4 support library as dependencies for less size diff --git a/README.md b/README.md index 0d135e4..db33736 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,13 @@ so you just need to add the followings to your ***build.gradle*** file: ```groovy dependencies { - debugCompile 'com.ms-square:debugoverlay:1.0.1' - releaseCompile 'com.ms-square:debugoverlay-no-op:1.0.1' - testCompile 'com.ms-square:debugoverlay-no-op:1.0.1' + debugCompile 'com.ms-square:debugoverlay:1.1.0' + releaseCompile 'com.ms-square:debugoverlay-no-op:1.1.0' + testCompile 'com.ms-square:debugoverlay-no-op:1.1.0' } ``` -Please note that `com.ms-square:debugoverlay:1.0.1` will add `android.permission.SYSTEM_ALERT_WINDOW` to your app. +Please note that `com.ms-square:debugoverlay:1.1.0` will add `android.permission.SYSTEM_ALERT_WINDOW` to your app. Threfore, you should avoid to use that dependency for your release build. FYI, the following table describes the total number of method/field references in this library's release aar. @@ -37,11 +37,11 @@ This data is acquired by using [Dexcount Gradle Plugin](https://github.com/KeepS | library | methods | fields | |:------------- |:-------------|:-------------| -|com.ms-square:debugoverlay:1.0.1|515|227| -|com.ms-square:debugoverlay-no-op:1.0.1|127|36| +|com.ms-square:debugoverlay:1.1.0|565|249| +|com.ms-square:debugoverlay-no-op:1.1.0|142|37| Due to the extensibility of this library, no-op version unfortunately has more than a few methods. -If you want to eliminate such method count in your release build, consider having separate `Application` class only for your debug build which uses this library and just specify `debugCompile 'com.ms-square:debugoverlay:1.0.1'` in the dependencies section of build.gradle. +If you want to eliminate such method count in your release build, consider having separate `Application` class only for your debug build which uses this library and just specify `debugCompile 'com.ms-square:debugoverlay:1.1.0'` in the dependencies section of build.gradle. Usage ------ @@ -62,7 +62,7 @@ public class ExampleApplication extends Application { ``` It will show a debug overlay on system layer with the follwing three default modules just like the gif animation image displayed on this README. -- [CpuUsageModule](#cpuusagemodule) +- [CpuUsageModule](#cpuusagemodule) - will not be shown on Android O and above - [MemInfoModule](#meminfomodule) - [FpsModule](#fpsmodule) @@ -125,6 +125,8 @@ Provided Modules `default` > Collects total and app cpu usage % by reading `/proc/stat` and `/proc/[myPid]/stat` respectively. +Note: CpuUsageModule will be no-op on Android O and above. Please see this [issue](https://github.com/Manabu-GT/DebugOverlay-Android/issues/11) for why. + #### MemInfoModule `default` @@ -142,6 +144,12 @@ If low memory situation is detected by reading [lowMemory](https://developer.and `optional` > Collects logcat messages generated by your own app even on non-rooted devices. +#### CpuFreqModule +`optional` +> Collects each cpu core's current and max frequency by reading `/sys/devices/system/cpu/cpu[num]/cpufreq/scaling_cur_freq` and `/sys/devices/system/cpu/cpu[num]/cpufreq/cpuinfo_max_freq` respectively. + +Note: CpuFreqModule will be no-op on Android O and above. Please see this [issue](https://github.com/Manabu-GT/DebugOverlay-Android/issues/11) for why. + Customization ------ @@ -198,7 +206,7 @@ Example: module = new CpuUsageModule(new MyCpuViewModule()); ``` -For **CpuUsage, MemInfo, and Fps modules**, you can pass your own layout resource id as long as it contains TextView as a direct child with id set to `debugoverlay_overlay_text` which is already defined in this library. This allows you to style the TextView used within those modules very easily without fully implementing new [ViewModule][5] by yourself. +For **CpuUsage, CpuFreq, MemInfo, and Fps modules**, you can pass your own layout resource id as long as it contains TextView as a direct child with id set to `debugoverlay_overlay_text` which is already defined in this library. This allows you to style the TextView used within those modules very easily without fully implementing new [ViewModule][5] by yourself. ### Adding your own overlay module @@ -254,7 +262,8 @@ Since a new custom module called `IPAddressModule` is created, let's actually sh ```java // inside Application's onCreate() new DebugOverlay.Builder(this) - .modules(new CpuUsageModule(), + .modules(new CpuFreqModule(), + new CpuUsageModule(), new MemInfoModule(this), new FpsModule(), new IPAddressModule(this)) @@ -264,7 +273,7 @@ new DebugOverlay.Builder(this) Now, the overlay successfully shows the newly added custom module at the bottom. -DebugOverlay Screen Capture +DebugOverlay Screen Capture Thanks for reading! diff --git a/art/overlay_with_custom_module_and_cpufreq_small.png b/art/overlay_with_custom_module_and_cpufreq_small.png new file mode 100644 index 0000000000000000000000000000000000000000..3dd0df859143d45ee5acf00cff885f17b4cefdcd GIT binary patch literal 81720 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

t1_}G*OwbT|Qz5?m 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 Date: Sat, 2 Sep 2017 00:40:37 -0600 Subject: [PATCH 17/18] update dexcount-gradle-plugin to 0.7.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5f51285..f595f8f 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.3' + classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.7.3' } } From 0aca7343ee9d5177788141c3bc6f500c0dcf27e6 Mon Sep 17 00:00:00 2001 From: Manabu-GT Date: Sat, 2 Sep 2017 00:41:11 -0600 Subject: [PATCH 18/18] update gradle.properties for v1.1.0 publish --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 93eb6a2..9d5d97b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,8 +26,8 @@ android.enableBuildCache=true # For maven central GROUP=com.ms-square -VERSION_NAME=1.0.1 -VERSION_CODE=2 +VERSION_NAME=1.1.0 +VERSION_CODE=3 POM_PACKAGING=aar POM_DESCRIPTION=Android library to display various debugging information in an overlay window