package com.lody.virtual.server.notification; import android.content.Context; import android.os.Build; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.lody.virtual.helper.utils.OSUtils; /** * Created by 247321453 on 2016/7/17. * notification's width */ /* package */ class WidthCompat { private final static String TAG = WidthCompat.class.getSimpleName(); private volatile int mWidth = 0; public int getNotificationWidth(Context context, int width, int height, int padding) { if (mWidth > 0) { return mWidth; } int w = getDefaultWidth(width, padding); if (OSUtils.getInstance().isEmui()) { // huawei's emui w = getEMUINotificationWidth(context, width, height); } else if (OSUtils.getInstance().isMiui()) { if (Build.VERSION.SDK_INT >= 21) { padding = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f, context.getResources().getDisplayMetrics())); w = getMIUINotificationWidth(context, width - padding * 2, height); } else { padding = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 25f, context.getResources().getDisplayMetrics())); w = getMIUINotificationWidth(context, width - padding * 2, height); } } mWidth = w; return w; } private int getDefaultWidth(int width, int padding) { if (Build.VERSION.SDK_INT >= 21) return width - padding * 2; return width; } private int getMIUINotificationWidth(Context context, int width, int height) { // status_bar_notification_row // adaptive // content try { Context systemUi = context.createPackageContext(NotificationCompat.SYSTEM_UI_PKG, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); int layoutId = getSystemId(systemUi, "status_bar_notification_row", "layout"); // status_bar_notification_row if (layoutId != 0) { ViewGroup viewGroup = createViewGroup(systemUi, layoutId); int lid = getSystemId(systemUi, "adaptive", "id"); if (lid == 0) { lid = getSystemId(systemUi, "content", "id"); } else { // miui5的子view不存在的空指针 View child = viewGroup.findViewById(lid); if (child != null && child instanceof ViewGroup) { ((ViewGroup) child).addView(new View(systemUi)); } } layout(viewGroup, width, height); if (lid != 0) { View child = viewGroup.findViewById(lid); if (child != null) { return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight(); } } else { int count = viewGroup.getChildCount(); for (int i = 0; i < count; i++) { View child = viewGroup.getChildAt(i); if (FrameLayout.class.isInstance(child) || "LatestItemView".equals(child.getClass().getName()) || "SizeAdaptiveLayout".equals(child.getClass().getName())) { return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight();// (LinearLayout)child; } } } } } catch (Exception e) { // ignore } return width; } /** * emui 3.0 */ private int getEMUINotificationWidth(Context context, int width, int height) { try { Context systemUi = context.createPackageContext(NotificationCompat.SYSTEM_UI_PKG, Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); int layoutId = getSystemId(systemUi, "time_axis", "layout"); if (layoutId != 0) { ViewGroup viewGroup = createViewGroup(systemUi, layoutId); layout(viewGroup, width, height); int lid = getSystemId(systemUi, "content_view_group", "id"); if (lid != 0) { View child = viewGroup.findViewById(lid); return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight(); } else { int count = viewGroup.getChildCount(); for (int i = 0; i < count; i++) { View child = viewGroup.getChildAt(i); if (LinearLayout.class.isInstance(child)) { // (LinearLayout)child; return width - child.getLeft() - child.getPaddingLeft() - child.getPaddingRight(); } } } } } catch (Exception e) { // ignore } return width; } private int getSystemId(Context systemUi, String name, String type) { return systemUi.getResources().getIdentifier(name, type, NotificationCompat.SYSTEM_UI_PKG); } private ViewGroup createViewGroup(Context context, int layoutId) { try { return (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null); } catch (Throwable e) { // ignore } return new FrameLayout(context); } private void layout(View view, int width, int height) { view.layout(0, 0, width, height); view.measure(View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST)); view.layout(0, 0, width, height); } }