diff options
Diffstat (limited to 'src/org/cyanogenmod/themes/provider/util/SystemUiPreviewGenerator.java')
-rw-r--r-- | src/org/cyanogenmod/themes/provider/util/SystemUiPreviewGenerator.java | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/org/cyanogenmod/themes/provider/util/SystemUiPreviewGenerator.java b/src/org/cyanogenmod/themes/provider/util/SystemUiPreviewGenerator.java new file mode 100644 index 0000000..d53ad2f --- /dev/null +++ b/src/org/cyanogenmod/themes/provider/util/SystemUiPreviewGenerator.java @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2014 The CyanogenMod Project + * + * 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 + * distributed under the License is distributed on an "AS IS" BASIS, + * 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 org.cyanogenmod.themes.provider.util; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.VectorDrawable; +import android.widget.FrameLayout; +import org.cyanogenmod.themes.provider.view.BatteryMeterView; + +import org.cyanogenmod.themes.provider.R; + +public class SystemUiPreviewGenerator { + public static final String SYSTEMUI_PACKAGE = "com.android.systemui"; + private static final String WIFI_DRAWABLE = "stat_sys_wifi_signal_3_fully"; + private static final String SIGNAL_DRAWABLE = "stat_sys_signal_3_fully"; + private static final String BLUETOOTH_DRAWABLE = "stat_sys_data_bluetooth_connected"; + private static final String STATUS_BAR_BATTERY_WIDTH = "status_bar_battery_width"; + private static final String STATUS_BAR_BATTERY_HEIGHT = "status_bar_battery_height"; + private static final String STATUS_BAR_CLOCK_COLOR = "status_bar_clock_color"; + private static final String SYSTEM_BAR_BACKGROUND = "system_bar_background"; + private static final String STATUS_BAR_BACKGROUND_OPAQUE = "status_bar_background_opaque"; + private static final String NAVIGATION_BAR_BACKGROUND_OPAQUE + = "navigation_bar_background_opaque"; + private static final String IC_SYSBAR_BACK = "ic_sysbar_back"; + private static final String IC_SYSBAR_HOME = "ic_sysbar_home"; + private static final String IC_SYSBAR_RECENT = "ic_sysbar_recent"; + private static final String STATUS_BAR_ICON_SIZE = "status_bar_icon_size"; + + private Context mContext; + + public SystemUiPreviewGenerator(Context context) { + mContext = context; + } + + /** + * Loads the necessary resources for the given theme. + * @param pkgName Package name for the theme to use + * @return + * @throws NameNotFoundException + */ + public SystemUiItems generateSystemUiItems(String pkgName) throws NameNotFoundException { + PackageManager pm = mContext.getPackageManager(); + Resources res = pm.getThemedResourcesForApplication(SYSTEMUI_PACKAGE, pkgName); + int iconSize = res.getDimensionPixelSize(res.getIdentifier(STATUS_BAR_ICON_SIZE, "dimen", + SYSTEMUI_PACKAGE)); + + SystemUiItems items = new SystemUiItems(); + Drawable d = res.getDrawable(res.getIdentifier(BLUETOOTH_DRAWABLE, "drawable", + SYSTEMUI_PACKAGE)); + items.bluetoothIcon = renderDrawableToBitmap(d, iconSize); + + d = res.getDrawable(res.getIdentifier(WIFI_DRAWABLE, "drawable", SYSTEMUI_PACKAGE)); + items.wifiIcon = renderDrawableToBitmap(d, iconSize); + + d = res.getDrawable(res.getIdentifier(SIGNAL_DRAWABLE, "drawable", SYSTEMUI_PACKAGE)); + items.signalIcon = renderDrawableToBitmap(d, iconSize); + + items.clockColor = res.getColor(res.getIdentifier(STATUS_BAR_CLOCK_COLOR, "color", + SYSTEMUI_PACKAGE)); + // wifi margin no longer used in systemui + items.wifiMarginEnd = 0; + generateBatteryPreviews(res, items); + generateBackgroundPreviews(res, items); + + items.navbarBack = BitmapFactory.decodeResource(res, res.getIdentifier(IC_SYSBAR_BACK, + "drawable", SYSTEMUI_PACKAGE)); + items.navbarHome = BitmapFactory.decodeResource(res, res.getIdentifier(IC_SYSBAR_HOME, + "drawable", SYSTEMUI_PACKAGE)); + items.navbarRecent = BitmapFactory.decodeResource(res, res.getIdentifier(IC_SYSBAR_RECENT, + "drawable", SYSTEMUI_PACKAGE)); + + return items; + } + + private Bitmap renderDrawableToBitmap(Drawable d, int iconSize) { + if (d instanceof VectorDrawable) { + return renderVectorDrawableToBitmap((VectorDrawable) d, iconSize); + } else if (d instanceof BitmapDrawable) { + return ((BitmapDrawable) d).getBitmap(); + } + + return null; + } + + private Bitmap renderVectorDrawableToBitmap(VectorDrawable d, int iconSize) { + Bitmap bmp = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bmp); + d.setBounds(0, 0, iconSize, iconSize); + d.draw(canvas); + + return bmp; + } + + /** + * Generates the various battery types using the provided resources. + * @param res + * @param items + */ + private void generateBatteryPreviews(Resources res, SystemUiItems items) { + FrameLayout view = new FrameLayout(mContext); + BatteryMeterView battery = new BatteryMeterView(mContext, res); + view.addView(battery, + new FrameLayout.LayoutParams(mContext.getResources().getDimensionPixelSize( + R.dimen.status_bar_battery_width), + mContext.getResources().getDimensionPixelSize( + R.dimen.status_bar_battery_height))); + battery.setMode(BatteryMeterView.BatteryMeterMode.BATTERY_METER_ICON_PORTRAIT); + items.batteryPortrait = LayoutRenderUtils.renderViewToBitmap(view); + battery.setMode(BatteryMeterView.BatteryMeterMode.BATTERY_METER_ICON_LANDSCAPE); + items.batteryLandscape = LayoutRenderUtils.renderViewToBitmap(view); + battery.setMode(BatteryMeterView.BatteryMeterMode.BATTERY_METER_CIRCLE); + items.batteryCircle = LayoutRenderUtils.renderViewToBitmap(view); + } + + private void generateBackgroundPreviews(Resources res, SystemUiItems items) { + int width = Math.max(res.getDisplayMetrics().widthPixels, + res.getDisplayMetrics().heightPixels); + int height = mContext.getResources().getDimensionPixelSize( + R.dimen.status_bar_battery_height); + Drawable defaultBackground = res.getDrawable( + res.getIdentifier(SYSTEM_BAR_BACKGROUND, "drawable", SYSTEMUI_PACKAGE)); + defaultBackground.setBounds(0, 0, width, height); + + Drawable statusbarBackground = null; + int resId = res.getIdentifier(STATUS_BAR_BACKGROUND_OPAQUE, "color", SYSTEMUI_PACKAGE); + if (resId != 0) { + statusbarBackground = new ColorDrawable(res.getColor(resId)); + statusbarBackground.setBounds(0, 0, width, height); + } + items.statusbarBackground = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(items.statusbarBackground); + if (statusbarBackground != null) { + statusbarBackground.draw(canvas); + } else { + defaultBackground.draw(canvas); + } + + Drawable navbarBackground = null; + resId = res.getIdentifier(NAVIGATION_BAR_BACKGROUND_OPAQUE, "color", SYSTEMUI_PACKAGE); + if (resId != 0) { + navbarBackground = new ColorDrawable(res.getColor(resId)); + navbarBackground.setBounds(0, 0, width, height); + } + items.navbarBackground = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + canvas.setBitmap(items.navbarBackground); + if (navbarBackground != null) { + navbarBackground.draw(canvas); + } else { + defaultBackground.draw(canvas); + } + } + + public class SystemUiItems { + /** + * Status bar items + */ + public Bitmap bluetoothIcon; + public Bitmap wifiIcon; + public Bitmap signalIcon; + public Bitmap batteryPortrait; + public Bitmap batteryLandscape; + public Bitmap batteryCircle; + public Bitmap statusbarBackground; + public int clockColor; + public int wifiMarginEnd; + + /** + * Navigation bar items + */ + public Bitmap navbarBackground; + public Bitmap navbarBack; + public Bitmap navbarHome; + public Bitmap navbarRecent; + } +} |