package com.contentwatch.ghoti.cp; import android.app.Notification; import android.content.Context; import android.util.DisplayMetrics; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.LinearLayout; import android.widget.TextView; /// A class for discovering Android Notification styles on Pre-Froyo (2.3) devices /// @remarks See http://stackoverflow.com/questions/4867338/custom-notification-layouts-and-text-colors/7320604#7320604 public class PreFroyoNotificationStyleDiscover { private Integer mNotifyTextColor = null; private float mNotifyTextSize = 11; private Integer mNotifyTitleColor = null; private float mNotifyTitleSize = 12; private final String TEXT_SEARCH_TEXT = "SearchForText"; private final String TEXT_SEARCH_TITLE = "SearchForTitle"; private Context mContext; PreFroyoNotificationStyleDiscover(Context context) { mContext = context; discoverStyle(); } public int getTextColor() { return mNotifyTextColor.intValue(); } public float getTextSize() { return mNotifyTextSize; } public int getTitleColor() { return mNotifyTitleColor; } public float getTitleSize() { return mNotifyTitleSize; } private boolean recurseGroup(ViewGroup group) { final int count = group.getChildCount(); for (int i = 0; i < count; ++i) { if(group.getChildAt(i) instanceof TextView) { final TextView tv = (TextView)group.getChildAt(i); final String text = tv.getText().toString(); if(text.startsWith("SearchFor")) { DisplayMetrics metrics = new DisplayMetrics(); WindowManager wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(metrics); if(TEXT_SEARCH_TEXT == text) { mNotifyTextColor = tv.getTextColors().getDefaultColor(); mNotifyTextSize = tv.getTextSize(); mNotifyTextSize /= metrics.scaledDensity; } else { mNotifyTitleColor = tv.getTextColors().getDefaultColor(); mNotifyTitleSize = tv.getTextSize(); mNotifyTitleSize /= metrics.scaledDensity; } if(null != mNotifyTitleColor && mNotifyTextColor != null) { return true; } } } else if (group.getChildAt(i) instanceof ViewGroup) { if(recurseGroup((ViewGroup)group.getChildAt(i))) { return true; } } } return false; } private void discoverStyle() { if(null != mNotifyTextColor) { // already done return; } try { Notification notify = new Notification(); notify.setLatestEventInfo(mContext, TEXT_SEARCH_TITLE, TEXT_SEARCH_TEXT, null); LinearLayout group = new LinearLayout(mContext); ViewGroup event = (ViewGroup)notify.contentView.apply(mContext, group); recurseGroup(event); group.removeAllViews(); } catch (Exception e) { // default to something mNotifyTextColor = android.R.color.black; mNotifyTitleColor = android.R.color.black; } } }