diff --git a/app/app.iml b/app/app.iml
index 6d3f41c25..069daf1c2 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -81,6 +81,7 @@
+
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/AbsTranslucentActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/AbsTranslucentActivity.java
index 60b6d0eea..572c1f3ca 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/AbsTranslucentActivity.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/AbsTranslucentActivity.java
@@ -20,7 +20,7 @@ import android.content.res.Configuration;
import com.hippo.ehviewer.util.Ui;
-public class AbsTranslucentActivity extends AbsActivity {
+public class AbsTranslucentActivity extends StatsActivity {
@Override
public void onConfigurationChanged(Configuration newConfig) {
@@ -29,6 +29,11 @@ public class AbsTranslucentActivity extends AbsActivity {
Ui.updateTranslucent(this);
}
+ @Override
+ protected boolean isShowStats() {
+ return true;
+ }
+
@Override
protected void onResume() {
super.onResume();
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java
index 6dd8db438..81d91835d 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java
@@ -39,7 +39,6 @@ import com.hippo.ehviewer.AppHandler;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.app.DirSelectDialog;
import com.hippo.ehviewer.app.MaterialAlertDialog;
-import com.hippo.ehviewer.content.Messenger;
import com.hippo.ehviewer.data.Data;
import com.hippo.ehviewer.data.GalleryInfo;
import com.hippo.ehviewer.ehclient.ExDownloader;
@@ -49,6 +48,7 @@ import com.hippo.ehviewer.gallery.ui.GLRootView;
import com.hippo.ehviewer.util.Config;
import com.hippo.ehviewer.util.FullScreenHelper;
import com.hippo.ehviewer.util.MathUtils;
+import com.hippo.ehviewer.util.Messenger;
import com.hippo.ehviewer.util.Utils;
import com.hippo.ehviewer.widget.ColorView;
import com.hippo.ehviewer.widget.MaterialToast;
@@ -56,7 +56,7 @@ import com.hippo.ehviewer.widget.SlidingLayout;
import java.io.File;
-public class GalleryActivity extends AbsActivity
+public class GalleryActivity extends StatsActivity
implements GalleryView.GalleryViewListener, SeekBar.OnSeekBarChangeListener,
FullScreenHelper.OnFullScreenBrokenListener, CompoundButton.OnCheckedChangeListener,
SlidingLayout.OnChildHideListener, AdapterView.OnItemSelectedListener,
@@ -266,6 +266,11 @@ public class GalleryActivity extends AbsActivity
mDecodeFormat.setSelection(Config.getDecodeFormatIndex());
}
+ @Override
+ protected boolean isShowStats() {
+ return true;
+ }
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -455,7 +460,7 @@ public class GalleryActivity extends AbsActivity
}
@Override
- public void onReceive(Object obj) {
+ public void onReceive(int id, Object obj) {
if (obj instanceof Boolean) {
mVolumePage = (Boolean) obj;
}
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java
index 90f65e638..63fc7ea48 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java
@@ -50,7 +50,6 @@ import com.hippo.ehviewer.UpdateHelper;
import com.hippo.ehviewer.app.DirSelectDialog;
import com.hippo.ehviewer.app.MaterialAlertDialog;
import com.hippo.ehviewer.app.MaterialProgressDialog;
-import com.hippo.ehviewer.content.Messenger;
import com.hippo.ehviewer.data.ApiGalleryInfo;
import com.hippo.ehviewer.data.Data;
import com.hippo.ehviewer.data.DownloadInfo;
@@ -58,14 +57,15 @@ import com.hippo.ehviewer.drawable.MaterialIndicatorDrawable;
import com.hippo.ehviewer.drawable.MaterialIndicatorDrawable.Stroke;
import com.hippo.ehviewer.ehclient.EhClient;
import com.hippo.ehviewer.ehclient.EhInfo;
+import com.hippo.ehviewer.miscellaneous.ActivityHelper;
+import com.hippo.ehviewer.miscellaneous.FavoriteHelper;
import com.hippo.ehviewer.network.HttpHelper;
import com.hippo.ehviewer.preference.ListPreference;
-import com.hippo.ehviewer.miscellaneous.ActivityHelper;
import com.hippo.ehviewer.util.BgThread;
import com.hippo.ehviewer.util.Config;
import com.hippo.ehviewer.util.DialogUtils;
import com.hippo.ehviewer.util.EhUtils;
-import com.hippo.ehviewer.miscellaneous.FavoriteHelper;
+import com.hippo.ehviewer.util.Messenger;
import com.hippo.ehviewer.util.Secret;
import com.hippo.ehviewer.util.Ui;
import com.hippo.ehviewer.util.Utils;
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/StatsActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/StatsActivity.java
new file mode 100644
index 000000000..254bba581
--- /dev/null
+++ b/app/src/main/java/com/hippo/ehviewer/ui/StatsActivity.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2015 Hippo Seven
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.hippo.ehviewer.ui;
+
+import android.annotation.SuppressLint;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.hippo.ehviewer.AppHandler;
+import com.hippo.ehviewer.R;
+import com.hippo.ehviewer.util.Constants;
+import com.hippo.ehviewer.util.Messenger;
+
+import java.util.Locale;
+
+public abstract class StatsActivity extends AbsActivity {
+
+ private static final int DEFAULT_MESSAGE_SIZE = 128;
+ private static final long STATS_CLOCK_INTERVAL_MS = 1000;
+ private static final int BYTES_IN_MEGABYTE = 1024 * 1024;
+
+ private TextView mStatsTextView;
+ private boolean mShowStats;
+ private Runnable mStatsClockTickRunnable;
+ private Handler mHandler;
+
+ private Messenger.Receiver mReceiver = new Messenger.Receiver() {
+ @Override
+ public void onReceive(int id, Object obj) {
+ if (obj instanceof Boolean) {
+ boolean showStats = (Boolean) obj;
+ if (mShowStats != showStats) {
+ mShowStats = showStats;
+ ViewGroup vg = (ViewGroup) getWindow().getDecorView();
+ if (showStats) {
+ vg.addView(mStatsTextView, generateLayoutParams());
+ updateStats();
+ scheduleNextStatsClockTick();
+ } else {
+ vg.removeView(mStatsTextView);
+ cancelNextStatsClockTick();
+ }
+ }
+ }
+ }
+ };
+
+ @SuppressLint("RtlHardcoded")
+ private ViewGroup.LayoutParams generateLayoutParams() {
+ Resources resources = getResources();
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.gravity = Gravity.TOP | Gravity.RIGHT;
+ lp.topMargin = resources.getDimensionPixelOffset(R.dimen.stats_text_view_padding_top);
+ lp.rightMargin = resources.getDimensionPixelOffset(R.dimen.stats_text_view_padding_right);
+ return lp;
+ }
+
+ protected abstract boolean isShowStats();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mStatsTextView = new TextView(this);
+ mHandler = AppHandler.getInstance();
+ mStatsClockTickRunnable = new Runnable() {
+ @Override
+ public void run() {
+ updateStats();
+ scheduleNextStatsClockTick();
+ }
+ };
+ Messenger.getInstance().register(
+ Constants.MESSENGER_ID_SHOW_APP_STATUS, mReceiver);
+
+ if (isShowStats()) {
+ mShowStats = true;
+ ((ViewGroup) getWindow().getDecorView()).addView(mStatsTextView,
+ generateLayoutParams());
+ } else {
+ mShowStats = false;
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ Messenger.getInstance().unregister(Constants.MESSENGER_ID_SHOW_APP_STATUS, mReceiver);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (mShowStats) {
+ updateStats();
+ scheduleNextStatsClockTick();
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+
+ if (mShowStats) {
+ cancelNextStatsClockTick();
+ }
+ }
+
+ private void scheduleNextStatsClockTick() {
+ mHandler.postDelayed(mStatsClockTickRunnable, STATS_CLOCK_INTERVAL_MS);
+ }
+
+ private void cancelNextStatsClockTick() {
+ mHandler.removeCallbacks(mStatsClockTickRunnable);
+ }
+
+ private void updateStats() {
+ final Runtime runtime = Runtime.getRuntime();
+ final long heapMemory = runtime.totalMemory() - runtime.freeMemory();
+ final StringBuilder sb = new StringBuilder(DEFAULT_MESSAGE_SIZE);
+ appendSize(sb, "Java heap size: ", heapMemory, "\n");
+ appendSize(sb, "Native heap size: ", Debug.getNativeHeapAllocatedSize(), "\n");
+ mStatsTextView.setText(sb.toString());
+ }
+
+ private static void appendSize(StringBuilder sb, String prefix, long bytes, String suffix) {
+ String value = String.format(Locale.getDefault(), "%.2f", (float) bytes / BYTES_IN_MEGABYTE);
+ appendValue(sb, prefix, value + " MB", suffix);
+ }
+
+ private static void appendValue(StringBuilder sb, String prefix, String value, String suffix) {
+ sb.append(prefix).append(value).append(suffix);
+ }
+}
diff --git a/app/src/main/java/com/hippo/ehviewer/util/Config.java b/app/src/main/java/com/hippo/ehviewer/util/Config.java
index 7581d25bd..361647549 100644
--- a/app/src/main/java/com/hippo/ehviewer/util/Config.java
+++ b/app/src/main/java/com/hippo/ehviewer/util/Config.java
@@ -22,7 +22,6 @@ import android.content.pm.ActivityInfo;
import android.os.Environment;
import android.preference.PreferenceManager;
-import com.hippo.ehviewer.content.Messenger;
import com.hippo.ehviewer.data.ListUrls;
import com.hippo.ehviewer.ehclient.EhClient;
diff --git a/app/src/main/java/com/hippo/ehviewer/util/Constants.java b/app/src/main/java/com/hippo/ehviewer/util/Constants.java
index 1aad0b013..0f92606f9 100644
--- a/app/src/main/java/com/hippo/ehviewer/util/Constants.java
+++ b/app/src/main/java/com/hippo/ehviewer/util/Constants.java
@@ -28,4 +28,11 @@ public final class Constants {
public static final int MAX_REDIRECTS = 5;
public static final int BUFFER_SIZE = 4096;
+
+ public static final int MESSENGER_ID_SHOW_APP_STATUS;
+
+ static {
+ Messenger messenger = Messenger.getInstance();
+ MESSENGER_ID_SHOW_APP_STATUS = messenger.newId();
+ }
}
diff --git a/app/src/main/java/com/hippo/ehviewer/content/Messenger.java b/app/src/main/java/com/hippo/ehviewer/util/Messenger.java
similarity index 72%
rename from app/src/main/java/com/hippo/ehviewer/content/Messenger.java
rename to app/src/main/java/com/hippo/ehviewer/util/Messenger.java
index 80963abcc..35005fcdb 100644
--- a/app/src/main/java/com/hippo/ehviewer/content/Messenger.java
+++ b/app/src/main/java/com/hippo/ehviewer/util/Messenger.java
@@ -1,9 +1,23 @@
-package com.hippo.ehviewer.content;
+/*
+ * Copyright (C) 2015 Hippo Seven
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.hippo.ehviewer.util;
import android.util.SparseArray;
import com.hippo.ehviewer.AppHandler;
-import com.hippo.ehviewer.util.IntIdGenerator;
import java.util.HashSet;
import java.util.Set;
@@ -40,7 +54,7 @@ public class Messenger {
Set receiverSet = mReceiverSetMap.get(id);
if (receiverSet != null) {
for (Receiver receiver : receiverSet) {
- receiver.onReceive(obj);
+ receiver.onReceive(id, obj);
}
}
}
@@ -68,6 +82,6 @@ public class Messenger {
}
public interface Receiver {
- void onReceive (final Object obj);
+ void onReceive(final int id, final Object obj);
}
}
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 20b3f9759..2170c7935 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -41,4 +41,7 @@
12dp
28dp
+ 24dp
+ 16dp
+