From 4ea38a40bbbfb2712307ce9b7698ee6fb6200ce3 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Sat, 26 Mar 2011 22:23:26 +0000 Subject: [PATCH] package size if 13% less :) --- ChangeLog | 2 + assets/default/menubar.xml | 16 -- default.properties | 1 + proguard.cfg | 33 ++++ .../android/fbreader/FBReader.java | 41 ++++- .../fbreader/fbreader/ActionCode.java | 2 +- .../core/application/ZLApplication.java | 149 ------------------ .../core/application/ZLApplicationWindow.java | 5 - .../ZLAndroidApplicationWindow.java | 51 ++---- .../ui/android/library/ZLAndroidActivity.java | 7 - .../android/library/ZLAndroidApplication.java | 2 +- 11 files changed, 87 insertions(+), 222 deletions(-) delete mode 100644 assets/default/menubar.xml create mode 100755 proguard.cfg diff --git a/ChangeLog b/ChangeLog index 49552512b..e0b9af55c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,8 @@ * No OutOfMemoryErrors in image loading * Float series index parsing has been fixed * Separate color for visited hyperlinks (original code by Steffen Siebert) +* Removed menubar.xml: menu list is moved into the code +* Proguard obfuscation has been added; package size decreased ===== 0.99.18 (Mar 15, 2011) ===== * Web-free icon diff --git a/assets/default/menubar.xml b/assets/default/menubar.xml deleted file mode 100644 index b88d97fea..000000000 --- a/assets/default/menubar.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/default.properties b/default.properties index a387af8c2..513f21f10 100644 --- a/default.properties +++ b/default.properties @@ -10,3 +10,4 @@ # Project target. target=android-8 java.encoding=utf-8 +proguard.config=proguard.cfg diff --git a/proguard.cfg b/proguard.cfg new file mode 100755 index 000000000..180e56f0d --- /dev/null +++ b/proguard.cfg @@ -0,0 +1,33 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/src/org/geometerplus/android/fbreader/FBReader.java b/src/org/geometerplus/android/fbreader/FBReader.java index 9f53b486a..5869090b1 100644 --- a/src/org/geometerplus/android/fbreader/FBReader.java +++ b/src/org/geometerplus/android/fbreader/FBReader.java @@ -73,7 +73,7 @@ public final class FBReader extends ZLAndroidActivity { @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - final ZLAndroidApplication application = ZLAndroidApplication.Instance(); + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); myFullScreenFlag = application.ShowStatusBarOption.getValue() ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setFlags( @@ -91,7 +91,7 @@ public final class FBReader extends ZLAndroidActivity { fbReader.addAction(ActionCode.SHOW_LIBRARY, new ShowLibraryAction(this, fbReader)); fbReader.addAction(ActionCode.SHOW_PREFERENCES, new ShowPreferencesAction(this, fbReader)); fbReader.addAction(ActionCode.SHOW_BOOK_INFO, new ShowBookInfoAction(this, fbReader)); - fbReader.addAction(ActionCode.SHOW_CONTENTS, new ShowTOCAction(this, fbReader)); + fbReader.addAction(ActionCode.SHOW_TOC, new ShowTOCAction(this, fbReader)); fbReader.addAction(ActionCode.SHOW_BOOKMARKS, new ShowBookmarksAction(this, fbReader)); fbReader.addAction(ActionCode.SHOW_NETWORK_LIBRARY, new ShowNetworkLibraryAction(this, fbReader)); @@ -106,7 +106,7 @@ public final class FBReader extends ZLAndroidActivity { @Override public boolean onPrepareOptionsMenu(Menu menu) { - final ZLAndroidApplication application = ZLAndroidApplication.Instance(); + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); if (!application.ShowStatusBarOption.getValue() && application.ShowStatusBarWhenMenuIsActiveOption.getValue()) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); @@ -117,7 +117,7 @@ public final class FBReader extends ZLAndroidActivity { @Override public void onOptionsMenuClosed(Menu menu) { super.onOptionsMenuClosed(menu); - final ZLAndroidApplication application = ZLAndroidApplication.Instance(); + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); if (!application.ShowStatusBarOption.getValue() && application.ShowStatusBarWhenMenuIsActiveOption.getValue()) { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); @@ -161,7 +161,7 @@ public final class FBReader extends ZLAndroidActivity { @Override public void onStart() { super.onStart(); - final ZLAndroidApplication application = ZLAndroidApplication.Instance(); + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); final int fullScreenFlag = application.ShowStatusBarOption.getValue() ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN; @@ -252,4 +252,35 @@ public final class FBReader extends ZLAndroidActivity { public void navigate() { ourNavigatePanel.runNavigation(); } + + private void addMenuItem(Menu menu, String actionId, int iconId) { + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); + application.myMainWindow.addMenuItem(menu, actionId, iconId); + } + + private void addMenuItem(Menu menu, String actionId) { + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); + application.myMainWindow.addMenuItem(menu, actionId, null); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + final ZLAndroidApplication application = (ZLAndroidApplication)getApplication(); + addMenuItem(menu, ActionCode.SHOW_LIBRARY, R.drawable.ic_menu_library); + addMenuItem(menu, ActionCode.SHOW_NETWORK_LIBRARY, R.drawable.ic_menu_networklibrary); + addMenuItem(menu, ActionCode.SHOW_TOC, R.drawable.ic_menu_toc); + addMenuItem(menu, ActionCode.SHOW_BOOKMARKS, R.drawable.ic_menu_bookmarks); + addMenuItem(menu, ActionCode.SWITCH_TO_NIGHT_PROFILE, R.drawable.ic_menu_night); + addMenuItem(menu, ActionCode.SWITCH_TO_DAY_PROFILE, R.drawable.ic_menu_day); + addMenuItem(menu, ActionCode.SEARCH, R.drawable.ic_menu_search); + addMenuItem(menu, ActionCode.SHOW_PREFERENCES); + addMenuItem(menu, ActionCode.SHOW_BOOK_INFO); + addMenuItem(menu, ActionCode.ROTATE); + addMenuItem(menu, ActionCode.INCREASE_FONT); + addMenuItem(menu, ActionCode.DECREASE_FONT); + addMenuItem(menu, ActionCode.SHOW_NAVIGATION); + + return true; + } } diff --git a/src/org/geometerplus/fbreader/fbreader/ActionCode.java b/src/org/geometerplus/fbreader/fbreader/ActionCode.java index 7ccec4ac2..c4f6ed3c0 100644 --- a/src/org/geometerplus/fbreader/fbreader/ActionCode.java +++ b/src/org/geometerplus/fbreader/fbreader/ActionCode.java @@ -23,7 +23,7 @@ public interface ActionCode { String SHOW_LIBRARY = "library"; String SHOW_PREFERENCES = "preferences"; String SHOW_BOOK_INFO = "bookInfo"; - String SHOW_CONTENTS = "toc"; + String SHOW_TOC = "toc"; String SHOW_BOOKMARKS = "bookmarks"; String SHOW_NETWORK_LIBRARY = "networkLibrary"; diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java index 71279427e..2d32f0734 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplication.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplication.java @@ -22,7 +22,6 @@ package org.geometerplus.zlibrary.core.application; import java.util.*; import org.geometerplus.zlibrary.core.filesystem.*; -import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.view.ZLView; import org.geometerplus.zlibrary.core.xml.ZLStringMap; import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter; @@ -42,17 +41,10 @@ public abstract class ZLApplication { private ZLView myView; private final HashMap myIdToActionMap = new HashMap(); - private Menubar myMenubar; //private ZLTime myLastKeyActionTime; protected ZLApplication() { ourInstance = this; - - new MenubarCreator().read(ZLResourceFile.createResourceFile("default/menubar.xml")); - } - - final Menubar getMenubar() { - return myMenubar; } protected final void setView(ZLView view) { @@ -72,7 +64,6 @@ public abstract class ZLApplication { } public void initWindow() { - myWindow.init(); setView(myView); } @@ -216,146 +207,6 @@ public abstract class ZLApplication { return (myWindow != null) ? myWindow.getBatteryLevel() : 0; } - //Menu - static class Menu { - public interface Item { - } - - private final ArrayList myItems = new ArrayList(); - private final ZLResource myResource; - - Menu(ZLResource resource) { - myResource = resource; - } - - ZLResource getResource() { - return myResource; - } - - void addItem(String actionId) { - myItems.add(new Menubar.PlainItem(myResource.getResource(actionId))); - } - - Menubar.Submenu addSubmenu(String key) { - Menubar.Submenu submenu = new Menubar.Submenu(myResource.getResource(key)); - myItems.add(submenu); - return submenu; - } - - int size() { - return myItems.size(); - } - - Item getItem(int index) { - return (Item)myItems.get(index); - } - } - - //MenuBar - public static final class Menubar extends Menu { - public static final class PlainItem implements Item { - private final ZLResource myResource; - - public PlainItem(ZLResource resource) { - myResource = resource; - } - - public String getActionId() { - return myResource.Name; - } - - public String getTitle() { - return myResource.getValue(); - } - }; - - public static final class Submenu extends Menu implements Item { - public Submenu(ZLResource resource) { - super(resource); - } - - public String getMenuName() { - return getResource().getValue(); - } - }; - - public Menubar() { - super(ZLResource.resource("menu")); - } - } - - //MenuVisitor - static public abstract class MenuVisitor { - public final void processMenu(ZLApplication application) { - if (application.myMenubar != null) { - processMenu(application.myMenubar); - } - } - - private final void processMenu(Menu menu) { - final int size = menu.size(); - for (int i = 0; i < size; ++i) { - final Menu.Item item = menu.getItem(i); - if (item instanceof Menubar.PlainItem) { - processItem((Menubar.PlainItem)item); - } else if (item instanceof Menubar.Submenu) { - Menubar.Submenu submenu = (Menubar.Submenu)item; - processSubmenuBeforeItems(submenu); - processMenu(submenu); - processSubmenuAfterItems(submenu); - } - } - } - - protected abstract void processSubmenuBeforeItems(Menubar.Submenu submenu); - protected abstract void processSubmenuAfterItems(Menubar.Submenu submenu); - protected abstract void processItem(Menubar.PlainItem item); - } - - private class MenubarCreator extends ZLXMLReaderAdapter { - private static final String ITEM = "item"; - private static final String SUBMENU = "submenu"; - - private final ArrayList mySubmenuStack = new ArrayList(); - - @Override - public boolean dontCacheAttributeValues() { - return true; - } - - @Override - public boolean startElementHandler(String tag, ZLStringMap attributes) { - if (myMenubar == null) { - myMenubar = new Menubar(); - } - final ArrayList stack = mySubmenuStack; - final Menu menu = stack.isEmpty() ? myMenubar : (Menu)stack.get(stack.size() - 1); - if (ITEM == tag) { - final String id = attributes.getValue("id"); - if (id != null) { - menu.addItem(id); - } - } else if (SUBMENU == tag) { - final String id = attributes.getValue("id"); - if (id != null) { - stack.add(menu.addSubmenu(id)); - } - } - return false; - } - - @Override - public boolean endElementHandler(String tag) { - if (SUBMENU == tag) { - final ArrayList stack = mySubmenuStack; - if (!stack.isEmpty()) { - stack.remove(stack.size() - 1); - } - } - return false; - } - } - private Timer myTimer; private final HashMap myTimerTaskPeriods = new HashMap(); private final HashMap myTimerTasks = new HashMap(); diff --git a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java index edf33237b..96dddc225 100644 --- a/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/core/application/ZLApplicationWindow.java @@ -31,11 +31,6 @@ abstract public class ZLApplicationWindow { return myApplication; } - protected void init() { - initMenu(); - } - - abstract protected void initMenu(); abstract protected void refreshMenu(); abstract protected void repaintView(); diff --git a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java index e4de4dcbc..f91660186 100644 --- a/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java +++ b/src/org/geometerplus/zlibrary/ui/android/application/ZLAndroidApplicationWindow.java @@ -26,6 +26,7 @@ import android.view.MenuItem; import org.geometerplus.zlibrary.core.application.ZLApplication; import org.geometerplus.zlibrary.core.application.ZLApplicationWindow; +import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.ui.android.view.ZLAndroidWidget; import org.geometerplus.zlibrary.ui.android.library.ZLAndroidLibrary; @@ -34,39 +35,12 @@ import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication; import org.geometerplus.zlibrary.ui.android.R; public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { - private final HashMap myMenuItemMap = - new HashMap(); - - private class MenuBuilder extends ZLApplication.MenuVisitor { - private int myItemCount = Menu.FIRST; - private final Stack myMenuStack = new Stack(); - - private MenuBuilder(Menu menu) { - myMenuStack.push(menu); - } - protected void processSubmenuBeforeItems(ZLApplication.Menubar.Submenu submenu) { - myMenuStack.push(myMenuStack.peek().addSubMenu(0, myItemCount++, Menu.NONE, submenu.getMenuName())); - } - protected void processSubmenuAfterItems(ZLApplication.Menubar.Submenu submenu) { - myMenuStack.pop(); - } - protected void processItem(ZLApplication.Menubar.PlainItem item) { - MenuItem menuItem = myMenuStack.peek().add(0, myItemCount++, Menu.NONE, item.getTitle()); - try { - final String fieldName = "ic_menu_" + item.getActionId().toLowerCase(); - menuItem.setIcon(R.drawable.class.getField(fieldName).getInt(null)); - } catch (NoSuchFieldException e) { - } catch (IllegalAccessException e) { - } - menuItem.setOnMenuItemClickListener(myMenuListener); - myMenuItemMap.put(menuItem, item); - } - } + private final HashMap myMenuItemMap = new HashMap(); private final MenuItem.OnMenuItemClickListener myMenuListener = new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { - getApplication().doAction(myMenuItemMap.get(item).getActionId()); + getApplication().doAction(myMenuItemMap.get(item)); return true; } }; @@ -75,24 +49,25 @@ public final class ZLAndroidApplicationWindow extends ZLApplicationWindow { super(application); } - public void buildMenu(Menu menu) { - new MenuBuilder(menu).processMenu(getApplication()); - refreshMenu(); + public void addMenuItem(Menu menu, String actionId, Integer iconId) { + final ZLResource resource = ZLResource.resource("menu"); + final MenuItem menuItem = menu.add(resource.getResource(actionId).getValue()); + if (iconId != null) { + menuItem.setIcon(iconId); + } + menuItem.setOnMenuItemClickListener(myMenuListener); + myMenuItemMap.put(menuItem, actionId); } @Override protected void refreshMenu() { - for (Map.Entry entry : myMenuItemMap.entrySet()) { - final String actionId = entry.getValue().getActionId(); + for (Map.Entry entry : myMenuItemMap.entrySet()) { + final String actionId = entry.getValue(); final ZLApplication application = getApplication(); entry.getKey().setVisible(application.isActionVisible(actionId) && application.isActionEnabled(actionId)); } } - public void initMenu() { - // TODO: implement - } - protected void repaintView() { final ZLAndroidWidget widget = ((ZLAndroidLibrary)ZLAndroidLibrary.Instance()).getWidget(); diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java index ade7715ba..b4083c2f8 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidActivity.java @@ -219,13 +219,6 @@ public abstract class ZLAndroidActivity extends Activity { return (ZLAndroidLibrary)ZLAndroidLibrary.Instance(); } - @Override - public boolean onCreateOptionsMenu(final Menu menu) { - super.onCreateOptionsMenu(menu); - ((ZLAndroidApplication)getApplication()).myMainWindow.buildMenu(menu); - return true; - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { View view = findViewById(R.id.main_view); diff --git a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidApplication.java b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidApplication.java index dc36b44b9..5ddacda28 100644 --- a/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidApplication.java +++ b/src/org/geometerplus/zlibrary/ui/android/library/ZLAndroidApplication.java @@ -56,7 +56,7 @@ public class ZLAndroidApplication extends Application { "PD_Novel".equals(Build.MODEL); } - ZLAndroidApplicationWindow myMainWindow; + public ZLAndroidApplicationWindow myMainWindow; @Override public void onCreate() {