From 027c73f460ffd8d19a54f29657af0ed40374cd9f Mon Sep 17 00:00:00 2001 From: seven332 Date: Thu, 7 May 2015 20:34:37 +0800 Subject: [PATCH] Add StatsActivity --- .../java/com/hippo/app/StatsActivity.java | 157 ++++++++++++++++++ .../java/com/hippo/ehviewer/Constants.java | 2 + .../hippo/ehviewer/ui/ContentActivity.java | 5 + .../com/hippo/ehviewer/ui/StartActivity.java | 9 +- .../java/com/hippo/scene/StageActivity.java | 4 +- app/src/main/res/values/dimens.xml | 4 + 6 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/hippo/app/StatsActivity.java diff --git a/app/src/main/java/com/hippo/app/StatsActivity.java b/app/src/main/java/com/hippo/app/StatsActivity.java new file mode 100644 index 000000000..ecb96592e --- /dev/null +++ b/app/src/main/java/com/hippo/app/StatsActivity.java @@ -0,0 +1,157 @@ +/* + * 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.app; + +import android.annotation.SuppressLint; +import android.content.res.Resources; +import android.os.Bundle; +import android.os.Debug; +import android.os.Handler; +import android.support.v7.app.AppCompatActivity; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import com.hippo.ehviewer.Constants; +import com.hippo.ehviewer.R; +import com.hippo.util.AppHandler; +import com.hippo.util.Messenger; + +import java.util.Locale; + +public abstract class StatsActivity extends AppCompatActivity { + + 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_top); + 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.getNativeHeapSize(), "\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/Constants.java b/app/src/main/java/com/hippo/ehviewer/Constants.java index ef5ecd490..8597aeef1 100644 --- a/app/src/main/java/com/hippo/ehviewer/Constants.java +++ b/app/src/main/java/com/hippo/ehviewer/Constants.java @@ -20,9 +20,11 @@ import com.hippo.util.Messenger; public final class Constants { public static final int MESSENGER_ID_SOURCE; + public static final int MESSENGER_ID_SHOW_APP_STATUS; static { Messenger messenger = Messenger.getInstance(); MESSENGER_ID_SOURCE = messenger.newId(); + MESSENGER_ID_SHOW_APP_STATUS = messenger.newId(); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java index cde0c699b..661283eb1 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/ContentActivity.java @@ -39,6 +39,11 @@ public class ContentActivity extends StageActivity private StatusBarLayout mStatusBarLayout; private StageLayout mContentLayout; + @Override + protected boolean isShowStats() { + return true; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java index ee15aa587..89a57eacd 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/StartActivity.java @@ -17,20 +17,25 @@ package com.hippo.ehviewer.ui; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.TextView; +import com.hippo.app.StatsActivity; import com.hippo.ehviewer.R; import com.hippo.util.ViewUtils; import com.larvalabs.svgandroid.SVG; import com.larvalabs.svgandroid.SVGBuilder; import com.larvalabs.svgandroid.SVGParseException; -public class StartActivity extends AppCompatActivity { +public class StartActivity extends StatsActivity { private static final String TAG = StartActivity.class.getSimpleName(); + @Override + protected boolean isShowStats() { + return true; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/hippo/scene/StageActivity.java b/app/src/main/java/com/hippo/scene/StageActivity.java index ab9869aee..ad9a1fb65 100644 --- a/app/src/main/java/com/hippo/scene/StageActivity.java +++ b/app/src/main/java/com/hippo/scene/StageActivity.java @@ -19,13 +19,13 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; import android.util.SparseArray; import android.view.View; +import com.hippo.app.StatsActivity; import com.hippo.util.IntIdGenerator; -public abstract class StageActivity extends AppCompatActivity { +public abstract class StageActivity extends StatsActivity { private IntIdGenerator mActivityResultIdGenerator = IntIdGenerator.create(); private SparseArray mActivityResultListenerMap = diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3a73353c2..9e1499aa4 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -15,6 +15,10 @@ --> + + 24dp + 16dp + 16dp