AmbilWarna library + new color picker + style editing
Conflicts: AndroidManifest.xml
|
@ -112,7 +112,8 @@
|
||||||
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
|
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.CancelActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.CancelActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.StyleListActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.style.StyleListActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
|
<activity android:name="org.geometerplus.android.fbreader.style.EditStyleActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.image.ImageViewActivity" android:process=":imageView" android:theme="@style/FBReader.Activity" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.image.ImageViewActivity" android:process=":imageView" android:theme="@style/FBReader.Activity" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<service android:name="org.geometerplus.android.fbreader.libraryService.LibraryService" android:launchMode="singleTask" android:process=":libraryService">
|
<service android:name="org.geometerplus.android.fbreader.libraryService.LibraryService" android:launchMode="singleTask" android:process=":libraryService">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|
|
@ -112,7 +112,8 @@
|
||||||
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
|
<meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.CancelActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.CancelActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.StyleListActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.style.StyleListActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
|
<activity android:name="org.geometerplus.android.fbreader.style.EditStyleActivity" android:theme="@style/FBReader.Dialog" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<activity android:name="org.geometerplus.android.fbreader.image.ImageViewActivity" android:process=":imageView" android:theme="@style/FBReader.Activity" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
<activity android:name="org.geometerplus.android.fbreader.image.ImageViewActivity" android:process=":imageView" android:theme="@style/FBReader.Activity" android:configChanges="orientation|keyboardHidden|screenSize"/>
|
||||||
<service android:name="org.geometerplus.android.fbreader.libraryService.LibraryService" android:launchMode="singleTask" android:process=":libraryService">
|
<service android:name="org.geometerplus.android.fbreader.libraryService.LibraryService" android:launchMode="singleTask" android:process=":libraryService">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
===== 1.8.2 (May ??, 2013) =====
|
===== 1.8.2 (Jun ??, 2013) =====
|
||||||
|
* New color picker dialog (AmbilWarna library http://code.google.com/p/android-color-picker/ is used)
|
||||||
* Updated Spanish loading (by Diego Bernardi, sponsored by Panacea Supplies)
|
* Updated Spanish loading (by Diego Bernardi, sponsored by Panacea Supplies)
|
||||||
* Updated Czech localization (by Marek Pavelka)
|
* Updated Czech localization (by Marek Pavelka)
|
||||||
* Updated Dutch localization (by Frank Fesevur)
|
* Updated Dutch localization (by Frank Fesevur)
|
||||||
|
|
|
@ -221,10 +221,19 @@
|
||||||
<node name="forward" value="Forward"/>
|
<node name="forward" value="Forward"/>
|
||||||
<node name="close" value="Close FBReader"/>
|
<node name="close" value="Close FBReader"/>
|
||||||
</node>
|
</node>
|
||||||
<node name="highlightingStyleMenu">
|
|
||||||
<node name="style" value="Style %s"/>
|
<node name="style" value="Style %s"/>
|
||||||
|
<node name="highlightingStyleMenu">
|
||||||
|
<node name="editStyle" value="Edit style…"/>
|
||||||
<node name="deleteBookmark" value="Delete bookmark"/>
|
<node name="deleteBookmark" value="Delete bookmark"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node name="editStyle">
|
||||||
|
<node name="name" value="Style name"/>
|
||||||
|
<node name="invisible" value="Invisible">
|
||||||
|
<node name="summaryOn" value="Do not highlight bookmarks"/>
|
||||||
|
<node name="summaryOff" value="Highlight bookmarks"/>
|
||||||
|
</node>
|
||||||
|
<node name="bgColor" value="Background color"/>
|
||||||
|
</node>
|
||||||
<node name="selection" value="Selection">
|
<node name="selection" value="Selection">
|
||||||
<node name="copyToClipboard" value="Copy to clipboard"/>
|
<node name="copyToClipboard" value="Copy to clipboard"/>
|
||||||
<node name="openInDictionary" value="Open in dictionary"/>
|
<node name="openInDictionary" value="Open in dictionary"/>
|
||||||
|
|
|
@ -11,3 +11,4 @@ java.encoding=utf-8
|
||||||
# proguard.config=proguard.cfg
|
# proguard.config=proguard.cfg
|
||||||
# Project target.
|
# Project target.
|
||||||
target=android-14
|
target=android-14
|
||||||
|
android.library.reference.1=third-party/AmbilWarna
|
||||||
|
|
33
res/layout/color_preference.xml
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||||
|
android:paddingRight="10dip"
|
||||||
|
android:paddingTop="10dip"
|
||||||
|
android:paddingBottom="10dip"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
>
|
||||||
|
<yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
|
||||||
|
android:id="@+id/color_preference_widget"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center_vertical|left"
|
||||||
|
android:focusable="false"
|
||||||
|
android:clickable="false"
|
||||||
|
/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/color_preference_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:gravity="center_vertical|left"
|
||||||
|
android:layout_marginLeft="13dip"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
/>
|
||||||
|
<View
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_weight="3"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
|
@ -9,12 +9,13 @@
|
||||||
android:paddingBottom="10dip"
|
android:paddingBottom="10dip"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
>
|
>
|
||||||
<ImageView
|
<yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
|
||||||
android:id="@+id/style_item_color"
|
android:id="@+id/style_item_color"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="24dp"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="24dp"
|
||||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
android:layout_gravity="center_vertical|left"
|
||||||
android:minWidth="?android:attr/listPreferredItemHeight"
|
android:focusable="false"
|
||||||
|
android:clickable="false"
|
||||||
/>
|
/>
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/style_item_title"
|
android:id="@+id/style_item_title"
|
||||||
|
@ -28,5 +29,13 @@
|
||||||
<View
|
<View
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_weight="3"
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:id="@+id/style_item_edit_button"
|
||||||
|
android:focusable="false"
|
||||||
|
android:focusableInTouchMode="false"
|
||||||
/>
|
/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -77,7 +77,7 @@ class ProcessHyperlinkAction extends FBAndroidAction {
|
||||||
intent.setData(Uri.parse(url));
|
intent.setData(Uri.parse(url));
|
||||||
intent.putExtra(
|
intent.putExtra(
|
||||||
ImageViewActivity.BACKGROUND_COLOR_KEY,
|
ImageViewActivity.BACKGROUND_COLOR_KEY,
|
||||||
Reader.ImageViewBackgroundOption.getValue().getIntValue()
|
Reader.ImageViewBackgroundOption.getValue().intValue()
|
||||||
);
|
);
|
||||||
OrientationUtil.startActivity(BaseActivity, intent);
|
OrientationUtil.startActivity(BaseActivity, intent);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.geometerplus.fbreader.book.Bookmark;
|
||||||
import org.geometerplus.fbreader.book.SerializerUtil;
|
import org.geometerplus.fbreader.book.SerializerUtil;
|
||||||
import org.geometerplus.fbreader.fbreader.FBReaderApp;
|
import org.geometerplus.fbreader.fbreader.FBReaderApp;
|
||||||
|
|
||||||
|
import org.geometerplus.android.fbreader.style.StyleListActivity;
|
||||||
import org.geometerplus.android.util.UIUtil;
|
import org.geometerplus.android.util.UIUtil;
|
||||||
|
|
||||||
public class SelectionBookmarkAction extends FBAndroidAction {
|
public class SelectionBookmarkAction extends FBAndroidAction {
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class ImageViewActivity extends Activity {
|
||||||
final Intent intent = getIntent();
|
final Intent intent = getIntent();
|
||||||
|
|
||||||
myBgColor = new ZLColor(
|
myBgColor = new ZLColor(
|
||||||
intent.getIntExtra(BACKGROUND_COLOR_KEY, new ZLColor(127, 127, 127).getIntValue())
|
intent.getIntExtra(BACKGROUND_COLOR_KEY, new ZLColor(127, 127, 127).intValue())
|
||||||
);
|
);
|
||||||
|
|
||||||
final Uri uri = intent.getData();
|
final Uri uri = intent.getData();
|
||||||
|
|
|
@ -416,7 +416,7 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public HighlightingStyle getHighlightingStyle(int styleId) {
|
public synchronized HighlightingStyle getHighlightingStyle(int styleId) {
|
||||||
if (myInterface == null) {
|
if (myInterface == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -427,7 +427,7 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<HighlightingStyle> highlightingStyles() {
|
public synchronized List<HighlightingStyle> highlightingStyles() {
|
||||||
if (myInterface == null) {
|
if (myInterface == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
@ -438,6 +438,16 @@ public class BookCollectionShadow extends AbstractBookCollection implements Serv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void saveHighlightingStyle(HighlightingStyle style) {
|
||||||
|
if (myInterface != null) {
|
||||||
|
try {
|
||||||
|
myInterface.saveHighlightingStyle(SerializerUtil.serialize(style));
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// method from ServiceConnection interface
|
// method from ServiceConnection interface
|
||||||
public synchronized void onServiceConnected(ComponentName name, IBinder service) {
|
public synchronized void onServiceConnected(ComponentName name, IBinder service) {
|
||||||
myInterface = LibraryInterface.Stub.asInterface(service);
|
myInterface = LibraryInterface.Stub.asInterface(service);
|
||||||
|
|
|
@ -47,4 +47,5 @@ interface LibraryInterface {
|
||||||
|
|
||||||
String getHighlightingStyle(in int styleId);
|
String getHighlightingStyle(in int styleId);
|
||||||
List<String> highlightingStyles();
|
List<String> highlightingStyles();
|
||||||
|
void saveHighlightingStyle(in String style);
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,6 +269,10 @@ public class LibraryService extends Service {
|
||||||
public List<String> highlightingStyles() {
|
public List<String> highlightingStyles() {
|
||||||
return SerializerUtil.serializeStyleList(myCollection.highlightingStyles());
|
return SerializerUtil.serializeStyleList(myCollection.highlightingStyles());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saveHighlightingStyle(String style) {
|
||||||
|
myCollection.saveHighlightingStyle(SerializerUtil.deserializeStyle(style));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private volatile LibraryImplementation myLibrary;
|
private volatile LibraryImplementation myLibrary;
|
||||||
|
|
|
@ -28,10 +28,11 @@ import android.database.sqlite.SQLiteStatement;
|
||||||
import android.database.SQLException;
|
import android.database.SQLException;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
||||||
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
import org.geometerplus.zlibrary.core.options.ZLStringOption;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
|
||||||
import org.geometerplus.zlibrary.core.config.ZLConfig;
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
import org.geometerplus.zlibrary.text.view.ZLTextPosition;
|
||||||
import org.geometerplus.zlibrary.text.view.ZLTextFixedPosition;
|
import org.geometerplus.zlibrary.text.view.ZLTextFixedPosition;
|
||||||
|
|
||||||
|
@ -883,15 +884,34 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
@Override
|
@Override
|
||||||
protected List<HighlightingStyle> loadStyles() {
|
protected List<HighlightingStyle> loadStyles() {
|
||||||
final LinkedList<HighlightingStyle> list = new LinkedList<HighlightingStyle>();
|
final LinkedList<HighlightingStyle> list = new LinkedList<HighlightingStyle>();
|
||||||
final String sql = "SELECT style_id,bg_color FROM HighlightingStyle";
|
final String sql = "SELECT style_id,name,bg_color FROM HighlightingStyle";
|
||||||
final Cursor cursor = myDatabase.rawQuery(sql, null);
|
final Cursor cursor = myDatabase.rawQuery(sql, null);
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
list.add(createStyle((int)cursor.getLong(0), (int)cursor.getLong(1)));
|
list.add(createStyle(
|
||||||
|
(int)cursor.getLong(0),
|
||||||
|
cursor.getString(1),
|
||||||
|
(int)cursor.getLong(2)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
cursor.close();
|
cursor.close();
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private SQLiteStatement myInsertStyleStatement;
|
||||||
|
protected void saveStyle(HighlightingStyle style) {
|
||||||
|
if (myInsertStyleStatement == null) {
|
||||||
|
myInsertStyleStatement = myDatabase.compileStatement(
|
||||||
|
"INSERT OR REPLACE INTO HighlightingStyle (style_id,name,bg_color) VALUES (?,?,?)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
myInsertStyleStatement.bindLong(1, style.Id);
|
||||||
|
final String name = style.getName();
|
||||||
|
myInsertStyleStatement.bindString(2, name != null ? name : "");
|
||||||
|
final ZLColor bgColor = style.getBackgroundColor();
|
||||||
|
myInsertStyleStatement.bindLong(3, bgColor != null ? bgColor.intValue() : -1);
|
||||||
|
myInsertStyleStatement.executeInsert();
|
||||||
|
}
|
||||||
|
|
||||||
private SQLiteStatement myInsertBookmarkStatement;
|
private SQLiteStatement myInsertBookmarkStatement;
|
||||||
private SQLiteStatement myUpdateBookmarkStatement;
|
private SQLiteStatement myUpdateBookmarkStatement;
|
||||||
@Override
|
@Override
|
||||||
|
@ -1410,7 +1430,7 @@ final class SQLiteBooksDatabase extends BooksDatabase {
|
||||||
myDatabase.execSQL(
|
myDatabase.execSQL(
|
||||||
"CREATE TABLE IF NOT EXISTS HighlightingStyle(" +
|
"CREATE TABLE IF NOT EXISTS HighlightingStyle(" +
|
||||||
"style_id INTEGER PRIMARY KEY," +
|
"style_id INTEGER PRIMARY KEY," +
|
||||||
"name TEXT," +
|
"name TEXT NOT NULL," +
|
||||||
"bg_color INTEGER NOT NULL)");
|
"bg_color INTEGER NOT NULL)");
|
||||||
myDatabase.execSQL("ALTER TABLE Bookmarks ADD COLUMN style_id INTEGER NOT NULL REFERENCES HighlightingStyle(style_id) DEFAULT 1");
|
myDatabase.execSQL("ALTER TABLE Bookmarks ADD COLUMN style_id INTEGER NOT NULL REFERENCES HighlightingStyle(style_id) DEFAULT 1");
|
||||||
myDatabase.execSQL("UPDATE Bookmarks SET end_paragraph = LENGTH(bookmark_text)");
|
myDatabase.execSQL("UPDATE Bookmarks SET end_paragraph = LENGTH(bookmark_text)");
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2013 Geometer Plus <contact@geometerplus.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geometerplus.android.fbreader.preferences;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import yuku.ambilwarna.AmbilWarnaDialog;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
|
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidColorUtil;
|
||||||
|
|
||||||
|
public abstract class ColorPreference extends Preference {
|
||||||
|
protected ColorPreference(Context context) {
|
||||||
|
super(context);
|
||||||
|
setWidgetLayoutResource(R.layout.color_preference);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract String getTitle();
|
||||||
|
protected abstract ZLColor getSavedColor();
|
||||||
|
protected abstract void saveColor(ZLColor color);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onBindView(View view) {
|
||||||
|
super.onBindView(view);
|
||||||
|
|
||||||
|
((TextView)view.findViewById(R.id.color_preference_title)).setText(getTitle());
|
||||||
|
final ZLColor color = getSavedColor();
|
||||||
|
view.findViewById(R.id.color_preference_widget).setBackgroundColor(
|
||||||
|
color != null ? ZLAndroidColorUtil.rgb(color) : 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onClick() {
|
||||||
|
new AmbilWarnaDialog(getContext(), ZLAndroidColorUtil.rgb(getSavedColor()), new AmbilWarnaDialog.OnAmbilWarnaListener() {
|
||||||
|
@Override
|
||||||
|
public void onOk(AmbilWarnaDialog dialog, int color) {
|
||||||
|
if (!callChangeListener(color)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
saveColor(new ZLColor(color));
|
||||||
|
notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCancel(AmbilWarnaDialog dialog) {
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,8 +24,8 @@ import android.preference.CheckBoxPreference;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
|
||||||
abstract class ZLCheckBoxPreference extends CheckBoxPreference {
|
public abstract class ZLCheckBoxPreference extends CheckBoxPreference {
|
||||||
ZLCheckBoxPreference(Context context, ZLResource rootResource, String resourceKey) {
|
protected ZLCheckBoxPreference(Context context, ZLResource rootResource, String resourceKey) {
|
||||||
super(context);
|
super(context);
|
||||||
|
|
||||||
ZLResource resource = rootResource.getResource(resourceKey);
|
ZLResource resource = rootResource.getResource(resourceKey);
|
||||||
|
|
|
@ -20,12 +20,6 @@
|
||||||
package org.geometerplus.android.fbreader.preferences;
|
package org.geometerplus.android.fbreader.preferences;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.graphics.*;
|
|
||||||
import android.graphics.drawable.*;
|
|
||||||
import android.preference.DialogPreference;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.SeekBar;
|
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.util.ZLColor;
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
import org.geometerplus.zlibrary.core.options.ZLColorOption;
|
import org.geometerplus.zlibrary.core.options.ZLColorOption;
|
||||||
|
@ -34,184 +28,27 @@ import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
import org.geometerplus.zlibrary.ui.android.R;
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidColorUtil;
|
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidColorUtil;
|
||||||
|
|
||||||
class ZLColorPreference extends DialogPreference {
|
class ZLColorPreference extends ColorPreference {
|
||||||
private final ZLColorOption myOption;
|
private final ZLColorOption myOption;
|
||||||
|
private final String myTitle;
|
||||||
private SeekBar myRedSlider;
|
|
||||||
private SeekBar myGreenSlider;
|
|
||||||
private SeekBar myBlueSlider;
|
|
||||||
private final GradientDrawable myPreviewDrawable = new GradientDrawable();
|
|
||||||
|
|
||||||
ZLColorPreference(Context context, ZLResource resource, String resourceKey, ZLColorOption option) {
|
ZLColorPreference(Context context, ZLResource resource, String resourceKey, ZLColorOption option) {
|
||||||
super(context, null);
|
super(context);
|
||||||
myOption = option;
|
myOption = option;
|
||||||
final String title = resource.getResource(resourceKey).getValue();
|
setWidgetLayoutResource(R.layout.color_preference);
|
||||||
setTitle(title);
|
|
||||||
setDialogTitle(title);
|
|
||||||
setDialogLayoutResource(R.layout.color_dialog);
|
|
||||||
|
|
||||||
final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button");
|
myTitle = resource.getResource(resourceKey).getValue();
|
||||||
setPositiveButtonText(buttonResource.getResource("ok").getValue());
|
|
||||||
setNegativeButtonText(buttonResource.getResource("cancel").getValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SeekBar createSlider(View view, int id, int value, String resourceKey) {
|
public String getTitle() {
|
||||||
final SeekBar slider = (SeekBar)view.findViewById(id);
|
return myTitle;
|
||||||
slider.setProgressDrawable(new SeekBarDrawable(
|
|
||||||
slider.getProgressDrawable(),
|
|
||||||
ZLResource.resource("color").getResource(resourceKey).getValue(),
|
|
||||||
slider
|
|
||||||
));
|
|
||||||
slider.setProgress(value);
|
|
||||||
return slider;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected ZLColor getSavedColor() {
|
||||||
protected void onBindDialogView(View view) {
|
return myOption.getValue();
|
||||||
final ZLColor color = myOption.getValue();
|
|
||||||
|
|
||||||
myRedSlider = createSlider(view, R.id.color_red, color.Red, "red");
|
|
||||||
myGreenSlider = createSlider(view, R.id.color_green, color.Green, "green");
|
|
||||||
myBlueSlider = createSlider(view, R.id.color_blue, color.Blue, "blue");
|
|
||||||
|
|
||||||
final View colorBox = view.findViewById(R.id.color_box);
|
|
||||||
colorBox.setBackgroundDrawable(myPreviewDrawable);
|
|
||||||
myPreviewDrawable.setCornerRadius(7);
|
|
||||||
myPreviewDrawable.setColor(ZLAndroidColorUtil.rgb(color));
|
|
||||||
|
|
||||||
final SeekBar.OnSeekBarChangeListener listener = new SeekBar.OnSeekBarChangeListener() {
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
myPreviewDrawable.setColor(Color.rgb(
|
|
||||||
myRedSlider.getProgress(),
|
|
||||||
myGreenSlider.getProgress(),
|
|
||||||
myBlueSlider.getProgress()
|
|
||||||
));
|
|
||||||
myPreviewDrawable.invalidateSelf();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
protected void saveColor(ZLColor color) {
|
||||||
}
|
myOption.setValue(color);
|
||||||
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
myPreviewDrawable.setColor(Color.rgb(
|
|
||||||
myRedSlider.getProgress(),
|
|
||||||
myGreenSlider.getProgress(),
|
|
||||||
myBlueSlider.getProgress()
|
|
||||||
));
|
|
||||||
myPreviewDrawable.invalidateSelf();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
myRedSlider.setOnSeekBarChangeListener(listener);
|
|
||||||
myGreenSlider.setOnSeekBarChangeListener(listener);
|
|
||||||
myBlueSlider.setOnSeekBarChangeListener(listener);
|
|
||||||
|
|
||||||
super.onBindDialogView(view);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
|
||||||
myOption.setValue(new ZLColor(
|
|
||||||
myRedSlider.getProgress(),
|
|
||||||
myGreenSlider.getProgress(),
|
|
||||||
myBlueSlider.getProgress()
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@Override
|
|
||||||
protected void onBindView(View view) {
|
|
||||||
final ImageView colorView = (ImageView)view.findViewById(R.id.color_preference_color);
|
|
||||||
//colorView.setImageResource(R.drawable.fbreader);
|
|
||||||
final Drawable drawable = new ColorDrawable(0x00FF00);
|
|
||||||
colorView.setImageDrawable(drawable);
|
|
||||||
|
|
||||||
super.onBindView(view);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
static class SeekBarDrawable extends Drawable {
|
|
||||||
private final SeekBar mySlider;
|
|
||||||
private final Drawable myBase;
|
|
||||||
private final String myText;
|
|
||||||
private final Paint myPaint;
|
|
||||||
private final Paint myOutlinePaint;
|
|
||||||
private boolean myLabelOnRight;
|
|
||||||
|
|
||||||
public SeekBarDrawable(Drawable base, String text, SeekBar slider) {
|
|
||||||
mySlider = slider;
|
|
||||||
myBase = base;
|
|
||||||
myText = text;
|
|
||||||
|
|
||||||
myPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
||||||
myPaint.setTypeface(Typeface.DEFAULT_BOLD);
|
|
||||||
myPaint.setColor(Color.BLACK);
|
|
||||||
myPaint.setAlpha(255);
|
|
||||||
|
|
||||||
myOutlinePaint = new Paint(myPaint);
|
|
||||||
myOutlinePaint.setStyle(Paint.Style.STROKE);
|
|
||||||
myOutlinePaint.setStrokeWidth(3);
|
|
||||||
myOutlinePaint.setColor(0xFFAAAAAA);
|
|
||||||
|
|
||||||
myLabelOnRight = mySlider.getProgress() < 128;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onBoundsChange(Rect bounds) {
|
|
||||||
myBase.setBounds(bounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean onStateChange(int[] state) {
|
|
||||||
invalidateSelf();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isStateful() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean onLevelChange(int level) {
|
|
||||||
if (level < 4000) {
|
|
||||||
myLabelOnRight = true;
|
|
||||||
} else if (level > 6000) {
|
|
||||||
myLabelOnRight = false;
|
|
||||||
}
|
|
||||||
return myBase.setLevel(level);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(Canvas canvas) {
|
|
||||||
myBase.draw(canvas);
|
|
||||||
|
|
||||||
final Rect bounds = getBounds();
|
|
||||||
final int textSize = bounds.height() * 2 / 3;
|
|
||||||
myPaint.setTextSize(textSize);
|
|
||||||
myOutlinePaint.setTextSize(textSize);
|
|
||||||
final Rect textBounds = new Rect();
|
|
||||||
myPaint.getTextBounds("a", 0, 1, textBounds);
|
|
||||||
final String text = myText + ": " + mySlider.getProgress();
|
|
||||||
final float textWidth = myOutlinePaint.measureText(text);
|
|
||||||
final float x = myLabelOnRight ? bounds.width() - textWidth - 6 : 6;
|
|
||||||
final float y = bounds.height() / 2 + textBounds.height();
|
|
||||||
canvas.drawText(text, x, y, myOutlinePaint);
|
|
||||||
canvas.drawText(text, x, y, myPaint);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getOpacity() {
|
|
||||||
return PixelFormat.TRANSLUCENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setAlpha(int alpha) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setColorFilter(ColorFilter cf) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,10 @@ import android.preference.EditTextPreference;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
|
||||||
abstract class ZLStringPreference extends EditTextPreference {
|
public abstract class ZLStringPreference extends EditTextPreference {
|
||||||
private String myValue;
|
private String myValue;
|
||||||
|
|
||||||
ZLStringPreference(Context context, ZLResource rootResource, String resourceKey) {
|
protected ZLStringPreference(Context context, ZLResource rootResource, String resourceKey) {
|
||||||
super(context);
|
super(context);
|
||||||
|
|
||||||
ZLResource resource = rootResource.getResource(resourceKey);
|
ZLResource resource = rootResource.getResource(resourceKey);
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2013 Geometer Plus <contact@geometerplus.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geometerplus.android.fbreader.style;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.preference.PreferenceActivity;
|
||||||
|
import android.preference.PreferenceScreen;
|
||||||
|
import android.view.Window;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
|
|
||||||
|
import org.geometerplus.fbreader.book.HighlightingStyle;
|
||||||
|
|
||||||
|
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
|
||||||
|
import org.geometerplus.android.fbreader.preferences.*;
|
||||||
|
|
||||||
|
public class EditStyleActivity extends PreferenceActivity {
|
||||||
|
static final String STYLE_ID_KEY = "style.id";
|
||||||
|
|
||||||
|
private final ZLResource myRootResource = ZLResource.resource("editStyle");
|
||||||
|
private final BookCollectionShadow myCollection = new BookCollectionShadow();
|
||||||
|
private HighlightingStyle myStyle;
|
||||||
|
private BgColorPreference myBgColorPreference;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle bundle) {
|
||||||
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
|
||||||
|
super.onCreate(bundle);
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler(new org.geometerplus.zlibrary.ui.android.library.UncaughtExceptionHandler(this));
|
||||||
|
|
||||||
|
final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(this);
|
||||||
|
setPreferenceScreen(screen);
|
||||||
|
|
||||||
|
myCollection.bindToService(this, new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
myStyle = myCollection.getHighlightingStyle(getIntent().getIntExtra(STYLE_ID_KEY, -1));
|
||||||
|
if (myStyle == null) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
screen.addPreference(new NamePreference());
|
||||||
|
screen.addPreference(new InvisiblePreference());
|
||||||
|
myBgColorPreference = new BgColorPreference();
|
||||||
|
screen.addPreference(myBgColorPreference);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
myCollection.unbind();
|
||||||
|
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class NamePreference extends ZLStringPreference {
|
||||||
|
NamePreference() {
|
||||||
|
super(EditStyleActivity.this, myRootResource, "name");
|
||||||
|
super.setValue(myStyle.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setValue(String value) {
|
||||||
|
super.setValue(value);
|
||||||
|
myStyle.setName(value);
|
||||||
|
myCollection.saveHighlightingStyle(myStyle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class InvisiblePreference extends ZLCheckBoxPreference {
|
||||||
|
private ZLColor mySavedBgColor;
|
||||||
|
|
||||||
|
InvisiblePreference() {
|
||||||
|
super(EditStyleActivity.this, myRootResource, "invisible");
|
||||||
|
setChecked(myStyle.getBackgroundColor() == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onClick() {
|
||||||
|
super.onClick();
|
||||||
|
if (isChecked()) {
|
||||||
|
mySavedBgColor = myStyle.getBackgroundColor();
|
||||||
|
myStyle.setBackgroundColor(null);
|
||||||
|
myBgColorPreference.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
myStyle.setBackgroundColor(
|
||||||
|
mySavedBgColor != null ? mySavedBgColor : new ZLColor(127, 127, 127)
|
||||||
|
);
|
||||||
|
myBgColorPreference.setEnabled(true);
|
||||||
|
}
|
||||||
|
myCollection.saveHighlightingStyle(myStyle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class BgColorPreference extends ColorPreference {
|
||||||
|
BgColorPreference() {
|
||||||
|
super(EditStyleActivity.this);
|
||||||
|
setEnabled(getSavedColor() != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle() {
|
||||||
|
return myRootResource.getResource("bgColor").getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ZLColor getSavedColor() {
|
||||||
|
return myStyle.getBackgroundColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void saveColor(ZLColor color) {
|
||||||
|
myStyle.setBackgroundColor(color);
|
||||||
|
myCollection.saveHighlightingStyle(myStyle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
* 02110-1301, USA.
|
* 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.geometerplus.android.fbreader;
|
package org.geometerplus.android.fbreader.style;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -30,16 +30,20 @@ import android.graphics.drawable.ColorDrawable;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
import android.view.*;
|
import android.view.*;
|
||||||
|
|
||||||
|
import yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView;
|
||||||
|
|
||||||
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
import org.geometerplus.zlibrary.ui.android.R;
|
import org.geometerplus.zlibrary.ui.android.R;
|
||||||
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidColorUtil;
|
import org.geometerplus.zlibrary.ui.android.util.ZLAndroidColorUtil;
|
||||||
|
|
||||||
import org.geometerplus.fbreader.book.*;
|
import org.geometerplus.fbreader.book.*;
|
||||||
|
|
||||||
|
import org.geometerplus.android.fbreader.FBReader;
|
||||||
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
|
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
|
||||||
|
|
||||||
public class StyleListActivity extends ListActivity {
|
public class StyleListActivity extends ListActivity implements IBookCollection.Listener {
|
||||||
static final String EXISTING_BOOKMARK_KEY = "existing.bookmark";
|
public static final String EXISTING_BOOKMARK_KEY = "existing.bookmark";
|
||||||
|
|
||||||
private final BookCollectionShadow myCollection = new BookCollectionShadow();
|
private final BookCollectionShadow myCollection = new BookCollectionShadow();
|
||||||
private boolean myExistingBookmark;
|
private boolean myExistingBookmark;
|
||||||
|
@ -72,6 +76,7 @@ public class StyleListActivity extends ListActivity {
|
||||||
final ActionListAdapter adapter = new ActionListAdapter(styles);
|
final ActionListAdapter adapter = new ActionListAdapter(styles);
|
||||||
setListAdapter(adapter);
|
setListAdapter(adapter);
|
||||||
getListView().setOnItemClickListener(adapter);
|
getListView().setOnItemClickListener(adapter);
|
||||||
|
myCollection.addListener(StyleListActivity.this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -82,6 +87,17 @@ public class StyleListActivity extends ListActivity {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// method from IBookCollection.Listener
|
||||||
|
public void onBookEvent(BookEvent event, Book book) {
|
||||||
|
if (event == BookEvent.BookmarkStyleChanged) {
|
||||||
|
((ActionListAdapter)getListAdapter()).setStyleList(myCollection.highlightingStyles());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// method from IBookCollection.Listener
|
||||||
|
public void onBuildEvent(IBookCollection.Status status) {
|
||||||
|
}
|
||||||
|
|
||||||
private class ActionListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {
|
private class ActionListAdapter extends BaseAdapter implements AdapterView.OnItemClickListener {
|
||||||
private final List<HighlightingStyle> myStyles;
|
private final List<HighlightingStyle> myStyles;
|
||||||
|
|
||||||
|
@ -89,11 +105,17 @@ public class StyleListActivity extends ListActivity {
|
||||||
myStyles = new ArrayList<HighlightingStyle>(styles);
|
myStyles = new ArrayList<HighlightingStyle>(styles);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final int getCount() {
|
public synchronized void setStyleList(List<HighlightingStyle> styles) {
|
||||||
|
myStyles.clear();
|
||||||
|
myStyles.addAll(styles);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final synchronized int getCount() {
|
||||||
return myExistingBookmark ? myStyles.size() + 1 : myStyles.size();
|
return myExistingBookmark ? myStyles.size() + 1 : myStyles.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final HighlightingStyle getItem(int position) {
|
public final synchronized HighlightingStyle getItem(int position) {
|
||||||
return position < myStyles.size() ? myStyles.get(position) : null;
|
return position < myStyles.size() ? myStyles.get(position) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,27 +123,54 @@ public class StyleListActivity extends ListActivity {
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
public View getView(int position, View convertView, final ViewGroup parent) {
|
public final synchronized View getView(int position, View convertView, final ViewGroup parent) {
|
||||||
final View view = convertView != null
|
final View view = convertView != null
|
||||||
? convertView
|
? convertView
|
||||||
: LayoutInflater.from(parent.getContext()).inflate(R.layout.style_item, parent, false);
|
: LayoutInflater.from(parent.getContext()).inflate(R.layout.style_item, parent, false);
|
||||||
final HighlightingStyle style = getItem(position);
|
final HighlightingStyle style = getItem(position);
|
||||||
|
|
||||||
final ImageView colorView = (ImageView)view.findViewById(R.id.style_item_color);
|
final AmbilWarnaPrefWidgetView colorView = (AmbilWarnaPrefWidgetView)view.findViewById(R.id.style_item_color);
|
||||||
final TextView titleView = (TextView)view.findViewById(R.id.style_item_title);
|
final TextView titleView = (TextView)view.findViewById(R.id.style_item_title);
|
||||||
|
final Button button = (Button)view.findViewById(R.id.style_item_edit_button);
|
||||||
|
|
||||||
|
final ZLResource resource = ZLResource.resource("highlightingStyleMenu");
|
||||||
|
|
||||||
if (style != null) {
|
if (style != null) {
|
||||||
colorView.setVisibility(View.VISIBLE);
|
String name = style.getName();
|
||||||
colorView.setImageDrawable(new ColorDrawable(ZLAndroidColorUtil.rgb(style.BackgroundColor)));
|
if (name == null || "".equals(name)) {
|
||||||
titleView.setText(
|
name = resource
|
||||||
ZLResource.resource("highlightingStyleMenu")
|
|
||||||
.getResource("style").getValue()
|
.getResource("style").getValue()
|
||||||
.replace("%s", String.valueOf(style.Id))
|
.replace("%s", String.valueOf(style.Id));
|
||||||
|
}
|
||||||
|
final ZLColor color = style.getBackgroundColor();
|
||||||
|
final int rgb = color != null ? ZLAndroidColorUtil.rgb(color) : -1;
|
||||||
|
|
||||||
|
colorView.setVisibility(View.VISIBLE);
|
||||||
|
if (rgb != -1) {
|
||||||
|
colorView.showCross(false);
|
||||||
|
colorView.setBackgroundColor(rgb);
|
||||||
|
} else {
|
||||||
|
colorView.showCross(true);
|
||||||
|
colorView.setBackgroundColor(0);
|
||||||
|
}
|
||||||
|
titleView.setText(name);
|
||||||
|
|
||||||
|
button.setVisibility(View.VISIBLE);
|
||||||
|
button.setText(resource.getResource("editStyle").getValue());
|
||||||
|
button.setOnClickListener(new Button.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
startActivity(
|
||||||
|
new Intent(StyleListActivity.this, EditStyleActivity.class)
|
||||||
|
.putExtra(EditStyleActivity.STYLE_ID_KEY, style.Id)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
colorView.setVisibility(View.GONE);
|
colorView.setVisibility(View.GONE);
|
||||||
|
button.setVisibility(View.GONE);
|
||||||
titleView.setText(
|
titleView.setText(
|
||||||
ZLResource.resource("highlightingStyleMenu")
|
resource
|
||||||
.getResource("deleteBookmark").getValue()
|
.getResource("deleteBookmark").getValue()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -129,7 +178,7 @@ public class StyleListActivity extends ListActivity {
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
public final synchronized void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
final HighlightingStyle style = getItem(position);
|
final HighlightingStyle style = getItem(position);
|
||||||
myCollection.bindToService(StyleListActivity.this, new Runnable() {
|
myCollection.bindToService(StyleListActivity.this, new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
|
@ -674,4 +674,10 @@ public class BookCollection extends AbstractBookCollection {
|
||||||
initStylesTable();
|
initStylesTable();
|
||||||
return new ArrayList<HighlightingStyle>(myStyles.values());
|
return new ArrayList<HighlightingStyle>(myStyles.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saveHighlightingStyle(HighlightingStyle style) {
|
||||||
|
myStyles.put(style.Id, style);
|
||||||
|
myDatabase.saveStyle(style);
|
||||||
|
fireBookEvent(BookEvent.BookmarkStyleChanged, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,5 +23,6 @@ public enum BookEvent {
|
||||||
Added,
|
Added,
|
||||||
Updated,
|
Updated,
|
||||||
Removed,
|
Removed,
|
||||||
BookmarksUpdated
|
BookmarksUpdated,
|
||||||
|
BookmarkStyleChanged,
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,10 +111,11 @@ public abstract class BooksDatabase {
|
||||||
protected abstract long saveBookmark(Bookmark bookmark);
|
protected abstract long saveBookmark(Bookmark bookmark);
|
||||||
protected abstract void deleteBookmark(Bookmark bookmark);
|
protected abstract void deleteBookmark(Bookmark bookmark);
|
||||||
|
|
||||||
protected HighlightingStyle createStyle(int id, int color) {
|
protected HighlightingStyle createStyle(int id, String name, int color) {
|
||||||
return new HighlightingStyle(id, new ZLColor(color));
|
return new HighlightingStyle(id, name, color != -1 ? new ZLColor(color) : null);
|
||||||
}
|
}
|
||||||
protected abstract List<HighlightingStyle> loadStyles();
|
protected abstract List<HighlightingStyle> loadStyles();
|
||||||
|
protected abstract void saveStyle(HighlightingStyle style);
|
||||||
|
|
||||||
protected abstract ZLTextPosition getStoredPosition(long bookId);
|
protected abstract ZLTextPosition getStoredPosition(long bookId);
|
||||||
protected abstract void storePosition(long bookId, ZLTextPosition position);
|
protected abstract void storePosition(long bookId, ZLTextPosition position);
|
||||||
|
|
|
@ -22,14 +22,41 @@ package org.geometerplus.fbreader.book;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.geometerplus.zlibrary.core.resources.ZLResource;
|
||||||
import org.geometerplus.zlibrary.core.util.ZLColor;
|
import org.geometerplus.zlibrary.core.util.ZLColor;
|
||||||
|
|
||||||
public class HighlightingStyle {
|
public class HighlightingStyle {
|
||||||
public final int Id;
|
public final int Id;
|
||||||
public final ZLColor BackgroundColor;
|
|
||||||
|
|
||||||
HighlightingStyle(int id, ZLColor bgColor) {
|
private String myName;
|
||||||
|
private ZLColor myBackgroundColor;
|
||||||
|
|
||||||
|
HighlightingStyle(int id, String name, ZLColor bgColor) {
|
||||||
Id = id;
|
Id = id;
|
||||||
BackgroundColor = bgColor;
|
myName = name;
|
||||||
|
myBackgroundColor = bgColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String defaultName() {
|
||||||
|
return ZLResource.resource("style").getValue().replace("%s", String.valueOf(Id));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
if (myName == null || "".equals(myName)) {
|
||||||
|
return defaultName();
|
||||||
|
}
|
||||||
|
return myName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
myName = defaultName().equals(name) ? "" : name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ZLColor getBackgroundColor() {
|
||||||
|
return myBackgroundColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBackgroundColor(ZLColor bgColor) {
|
||||||
|
myBackgroundColor = bgColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,4 +85,5 @@ public interface IBookCollection {
|
||||||
|
|
||||||
HighlightingStyle getHighlightingStyle(int styleId);
|
HighlightingStyle getHighlightingStyle(int styleId);
|
||||||
List<HighlightingStyle> highlightingStyles();
|
List<HighlightingStyle> highlightingStyles();
|
||||||
|
void saveHighlightingStyle(HighlightingStyle style);
|
||||||
}
|
}
|
||||||
|
|
|
@ -309,13 +309,12 @@ class XMLSerializer extends AbstractSerializer {
|
||||||
@Override
|
@Override
|
||||||
public String serialize(HighlightingStyle style) {
|
public String serialize(HighlightingStyle style) {
|
||||||
final StringBuilder buffer = new StringBuilder();
|
final StringBuilder buffer = new StringBuilder();
|
||||||
appendTag(buffer, "style", false,
|
final ZLColor bgColor = style.getBackgroundColor();
|
||||||
"id", String.valueOf(style.Id)
|
appendTag(buffer, "style", true,
|
||||||
|
"id", String.valueOf(style.Id),
|
||||||
|
"name", style.getName(),
|
||||||
|
"bg-color", bgColor != null ? String.valueOf(bgColor.intValue()) : "-1"
|
||||||
);
|
);
|
||||||
appendTag(buffer, "bg-color", true,
|
|
||||||
"value", String.valueOf(style.BackgroundColor.getIntValue())
|
|
||||||
);
|
|
||||||
closeTag(buffer, "style");
|
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -961,9 +960,6 @@ class XMLSerializer extends AbstractSerializer {
|
||||||
private static final class StyleDeserializer extends DefaultHandler {
|
private static final class StyleDeserializer extends DefaultHandler {
|
||||||
private HighlightingStyle myStyle;
|
private HighlightingStyle myStyle;
|
||||||
|
|
||||||
private int myId = -1;
|
|
||||||
private int myColor;
|
|
||||||
|
|
||||||
public HighlightingStyle getStyle() {
|
public HighlightingStyle getStyle() {
|
||||||
return myStyle;
|
return myStyle;
|
||||||
}
|
}
|
||||||
|
@ -971,29 +967,22 @@ class XMLSerializer extends AbstractSerializer {
|
||||||
@Override
|
@Override
|
||||||
public void startDocument() {
|
public void startDocument() {
|
||||||
myStyle = null;
|
myStyle = null;
|
||||||
myId = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void endDocument() {
|
|
||||||
if (myId != -1) {
|
|
||||||
myStyle = new HighlightingStyle(myId, new ZLColor(myColor));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||||
if ("style".equals(localName)) {
|
if ("style".equals(localName)) {
|
||||||
try {
|
try {
|
||||||
myId = Integer.parseInt(attributes.getValue("id"));
|
final int id = Integer.parseInt(attributes.getValue("id"));
|
||||||
} catch (Exception e) {
|
if (id != -1) {
|
||||||
throw new SAXException("XML parsing error", e);
|
final int rgb = Integer.parseInt(attributes.getValue("bg-color"));
|
||||||
|
final ZLColor color = rgb != -1 ? new ZLColor(rgb) : null;
|
||||||
|
myStyle = new HighlightingStyle(
|
||||||
|
id, attributes.getValue("name"), color
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} else if ("bg-color".equals(localName)) {
|
|
||||||
try {
|
|
||||||
myColor = Integer.parseInt(attributes.getValue("value"));
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new SAXException("XML parsing error", e);
|
// ignore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,6 @@ public final class BookmarkHighlighting extends ZLTextSimpleHighlighting {
|
||||||
@Override
|
@Override
|
||||||
public ZLColor getBackgroundColor() {
|
public ZLColor getBackgroundColor() {
|
||||||
final HighlightingStyle bmStyle = Collection.getHighlightingStyle(Bookmark.getStyleId());
|
final HighlightingStyle bmStyle = Collection.getHighlightingStyle(Bookmark.getStyleId());
|
||||||
return bmStyle != null ? bmStyle.BackgroundColor : new ZLColor(255, 255, 255);
|
return bmStyle != null ? bmStyle.getBackgroundColor() : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,8 +118,9 @@ public final class FBReaderApp extends ZLApplication {
|
||||||
collection.addListener(new IBookCollection.Listener() {
|
collection.addListener(new IBookCollection.Listener() {
|
||||||
public void onBookEvent(BookEvent event, Book book) {
|
public void onBookEvent(BookEvent event, Book book) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
case BookmarkStyleChanged:
|
||||||
case BookmarksUpdated:
|
case BookmarksUpdated:
|
||||||
if (Model != null && book.equals(Model.Book)) {
|
if (Model != null && (book == null || book.equals(Model.Book))) {
|
||||||
if (BookTextView.getModel() != null) {
|
if (BookTextView.getModel() != null) {
|
||||||
setBookmarkHighlightings(BookTextView, null);
|
setBookmarkHighlightings(BookTextView, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@ public final class ZLColorOption extends ZLOption {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
try {
|
try {
|
||||||
int intValue = Integer.parseInt(value);
|
int intValue = Integer.parseInt(value);
|
||||||
if (myValue.getIntValue() != intValue) {
|
if (myValue.intValue() != intValue) {
|
||||||
myValue = new ZLColor(intValue);
|
myValue = new ZLColor(intValue);
|
||||||
}
|
}
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
|
@ -61,7 +61,7 @@ public final class ZLColorOption extends ZLOption {
|
||||||
if (colorValue.equals(myDefaultValue)) {
|
if (colorValue.equals(myDefaultValue)) {
|
||||||
unsetConfigValue();
|
unsetConfigValue();
|
||||||
} else {
|
} else {
|
||||||
setConfigValue("" + colorValue.getIntValue());
|
setConfigValue(String.valueOf(colorValue.intValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ public final class ZLColor {
|
||||||
Blue = (short)(intValue & 0xFF);
|
Blue = (short)(intValue & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getIntValue() {
|
public int intValue() {
|
||||||
return (Red << 16) + (Green << 8) + Blue;
|
return (Red << 16) + (Green << 8) + Blue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ public final class ZLColor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return getIntValue();
|
return intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -837,6 +837,10 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
final ZLTextElementArea fromArea = page.TextElementMap.get(from);
|
final ZLTextElementArea fromArea = page.TextElementMap.get(from);
|
||||||
final ZLTextElementArea toArea = page.TextElementMap.get(to - 1);
|
final ZLTextElementArea toArea = page.TextElementMap.get(to - 1);
|
||||||
for (ZLTextHighlighting h : hilites) {
|
for (ZLTextHighlighting h : hilites) {
|
||||||
|
final ZLColor bgColor = h.getBackgroundColor();
|
||||||
|
if (bgColor == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
final ZLTextElementArea selectionStartArea = h.getStartArea(page);
|
final ZLTextElementArea selectionStartArea = h.getStartArea(page);
|
||||||
if (selectionStartArea == null || selectionStartArea.compareTo(toArea) > 0) {
|
if (selectionStartArea == null || selectionStartArea.compareTo(toArea) > 0) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -859,7 +863,7 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
} else {
|
} else {
|
||||||
right = selectionEndArea.XEnd;
|
right = selectionEndArea.XEnd;
|
||||||
}
|
}
|
||||||
getContext().setFillColor(h.getBackgroundColor());
|
getContext().setFillColor(bgColor);
|
||||||
getContext().fillRectangle(left, top, right, bottom);
|
getContext().fillRectangle(left, top, right, bottom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1587,7 +1591,7 @@ public abstract class ZLTextView extends ZLTextViewBase {
|
||||||
}
|
}
|
||||||
synchronized (myHighlightings) {
|
synchronized (myHighlightings) {
|
||||||
for (ZLTextHighlighting h : myHighlightings) {
|
for (ZLTextHighlighting h : myHighlightings) {
|
||||||
if (h.intersects(region)) {
|
if (h.getBackgroundColor() != null && h.intersects(region)) {
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
30
third-party/AmbilWarna/AmbilWarna.iml
vendored
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="EclipseModuleManager" forced_jdk="true">
|
||||||
|
<conelement value="com.android.ide.eclipse.adt.DEPENDENCIES" />
|
||||||
|
<src_description expected_position="1">
|
||||||
|
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
|
||||||
|
<src_folder value="file://$MODULE_DIR$/gen" expected_position="1" />
|
||||||
|
<src_folder value="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" expected_position="2" />
|
||||||
|
<src_folder value="com.android.ide.eclipse.adt.LIBRARIES" expected_position="3" />
|
||||||
|
</src_description>
|
||||||
|
</component>
|
||||||
|
<component name="FacetManager">
|
||||||
|
<facet type="android" name="Android">
|
||||||
|
<configuration>
|
||||||
|
<option name="LIBRARY_PROJECT" value="true" />
|
||||||
|
</configuration>
|
||||||
|
</facet>
|
||||||
|
</component>
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="false">
|
||||||
|
<output url="file://$MODULE_DIR$/bin/classes" />
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="jdk" jdkName="Android 4.2.2 Platform" jdkType="Android SDK" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
|
|
13
third-party/AmbilWarna/AndroidManifest.xml
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="yuku.ambilwarna"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
|
||||||
|
<application>
|
||||||
|
</application>
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="3" />
|
||||||
|
|
||||||
|
</manifest>
|
92
third-party/AmbilWarna/build.xml
vendored
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="AmbilWarna" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contains the path to the SDK. It should *NOT* be checked into
|
||||||
|
Version Control Systems. -->
|
||||||
|
<property file="local.properties" />
|
||||||
|
|
||||||
|
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||||
|
'android' tool to add properties to it.
|
||||||
|
This is the place to change some Ant specific build properties.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
source.dir
|
||||||
|
The name of the source directory. Default is 'src'.
|
||||||
|
out.dir
|
||||||
|
The name of the output directory. Default is 'bin'.
|
||||||
|
|
||||||
|
For other overridable properties, look at the beginning of the rules
|
||||||
|
files in the SDK, at tools/ant/build.xml
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should
|
||||||
|
be updated using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="ant.properties" />
|
||||||
|
|
||||||
|
<!-- if sdk.dir was not set from one of the property file, then
|
||||||
|
get it from the ANDROID_HOME env var.
|
||||||
|
This must be done before we load project.properties since
|
||||||
|
the proguard config can use sdk.dir -->
|
||||||
|
<property environment="env" />
|
||||||
|
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||||
|
<isset property="env.ANDROID_HOME" />
|
||||||
|
</condition>
|
||||||
|
|
||||||
|
<!-- The project.properties file is created and updated by the 'android'
|
||||||
|
tool, as well as ADT.
|
||||||
|
|
||||||
|
This contains project specific properties such as project target, and library
|
||||||
|
dependencies. Lower level build properties are stored in ant.properties
|
||||||
|
(or in .classpath for Eclipse projects).
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems. -->
|
||||||
|
<loadproperties srcFile="project.properties" />
|
||||||
|
|
||||||
|
<!-- quick check on sdk.dir -->
|
||||||
|
<fail
|
||||||
|
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||||
|
unless="sdk.dir"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Import per project custom build rules if present at the root of the project.
|
||||||
|
This is the place to put custom intermediary targets such as:
|
||||||
|
-pre-build
|
||||||
|
-pre-compile
|
||||||
|
-post-compile (This is typically used for code obfuscation.
|
||||||
|
Compiled code location: ${out.classes.absolute.dir}
|
||||||
|
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||||
|
-post-package
|
||||||
|
-post-build
|
||||||
|
-pre-clean
|
||||||
|
-->
|
||||||
|
<import file="custom_rules.xml" optional="true" />
|
||||||
|
|
||||||
|
<!-- Import the actual build file.
|
||||||
|
|
||||||
|
To customize existing targets, there are two options:
|
||||||
|
- Customize only one target:
|
||||||
|
- copy/paste the target into this file, *before* the
|
||||||
|
<import> task.
|
||||||
|
- customize it to your needs.
|
||||||
|
- Customize the whole content of build.xml
|
||||||
|
- copy/paste the content of the rules files (minus the top node)
|
||||||
|
into this file, replacing the <import> task.
|
||||||
|
- customize to your needs.
|
||||||
|
|
||||||
|
***********************
|
||||||
|
****** IMPORTANT ******
|
||||||
|
***********************
|
||||||
|
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||||
|
in order to avoid having your file be overridden by tools such as "android update project"
|
||||||
|
-->
|
||||||
|
<!-- version-tag: 1 -->
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||||
|
|
||||||
|
</project>
|
14
third-party/AmbilWarna/project.properties
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system use,
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
|
||||||
|
android.library=true
|
||||||
|
# Indicates whether an apk should be generated for each density.
|
||||||
|
split.density=false
|
||||||
|
# Project target.
|
||||||
|
target=android-11
|
BIN
third-party/AmbilWarna/res/drawable-hdpi/ambilwarna_arrow_down.png
vendored
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
third-party/AmbilWarna/res/drawable-hdpi/ambilwarna_arrow_right.png
vendored
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
third-party/AmbilWarna/res/drawable-hdpi/ambilwarna_cursor.png
vendored
Normal file
After Width: | Height: | Size: 666 B |
BIN
third-party/AmbilWarna/res/drawable-hdpi/ambilwarna_target.png
vendored
Normal file
After Width: | Height: | Size: 983 B |
BIN
third-party/AmbilWarna/res/drawable-ldpi/ambilwarna_arrow_down.png
vendored
Normal file
After Width: | Height: | Size: 748 B |
BIN
third-party/AmbilWarna/res/drawable-ldpi/ambilwarna_arrow_right.png
vendored
Normal file
After Width: | Height: | Size: 751 B |
BIN
third-party/AmbilWarna/res/drawable-ldpi/ambilwarna_cursor.png
vendored
Normal file
After Width: | Height: | Size: 480 B |
BIN
third-party/AmbilWarna/res/drawable-ldpi/ambilwarna_target.png
vendored
Normal file
After Width: | Height: | Size: 607 B |
BIN
third-party/AmbilWarna/res/drawable-xhdpi/ambilwarna_arrow_down.png
vendored
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
third-party/AmbilWarna/res/drawable-xhdpi/ambilwarna_arrow_right.png
vendored
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
third-party/AmbilWarna/res/drawable-xhdpi/ambilwarna_cursor.png
vendored
Normal file
After Width: | Height: | Size: 782 B |
BIN
third-party/AmbilWarna/res/drawable-xhdpi/ambilwarna_target.png
vendored
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
third-party/AmbilWarna/res/drawable/ambilwarna_arrow_down.png
vendored
Normal file
After Width: | Height: | Size: 889 B |
BIN
third-party/AmbilWarna/res/drawable/ambilwarna_arrow_right.png
vendored
Normal file
After Width: | Height: | Size: 814 B |
BIN
third-party/AmbilWarna/res/drawable/ambilwarna_cursor.png
vendored
Normal file
After Width: | Height: | Size: 579 B |
BIN
third-party/AmbilWarna/res/drawable/ambilwarna_hue.png
vendored
Normal file
After Width: | Height: | Size: 455 B |
BIN
third-party/AmbilWarna/res/drawable/ambilwarna_target.png
vendored
Normal file
After Width: | Height: | Size: 816 B |
85
third-party/AmbilWarna/res/layout-land/ambilwarna_dialog.xml
vendored
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/ambilwarna_viewContainer"
|
||||||
|
android:paddingTop="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingRight="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingBottom="0dp"
|
||||||
|
android:paddingLeft="@dimen/ambilwarna_spacer"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
>
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/ambilwarna_state"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingRight="@dimen/ambilwarna_spacer"
|
||||||
|
android:gravity="center"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
>
|
||||||
|
<View
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:id="@+id/ambilwarna_warnaLama"
|
||||||
|
android:background="#faa"
|
||||||
|
/>
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:src="@drawable/ambilwarna_arrow_down"
|
||||||
|
android:paddingTop="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingBottom="@dimen/ambilwarna_spacer"
|
||||||
|
/>
|
||||||
|
<View
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:id="@+id/ambilwarna_warnaBaru"
|
||||||
|
android:background="#aaf"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
<yuku.ambilwarna.AmbilWarnaKotak
|
||||||
|
android:id="@+id/ambilwarna_viewSatBri"
|
||||||
|
android:layout_width="@dimen/ambilwarna_hsvWidth"
|
||||||
|
android:layout_height="@dimen/ambilwarna_hsvHeight"
|
||||||
|
android:layout_toRightOf="@id/ambilwarna_state"
|
||||||
|
android:layerType="software"
|
||||||
|
/>
|
||||||
|
<!-- needed because i can't get parent keeping its bottom layout
|
||||||
|
and its wrap_content height. This view will serve as a bottom spacer. -->
|
||||||
|
<View
|
||||||
|
android:layout_width="@dimen/ambilwarna_spacer"
|
||||||
|
android:layout_height="@dimen/ambilwarna_spacer"
|
||||||
|
android:layout_below="@id/ambilwarna_viewSatBri"
|
||||||
|
/>
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_viewHue"
|
||||||
|
android:layout_width="@dimen/ambilwarna_hueWidth"
|
||||||
|
android:layout_height="@dimen/ambilwarna_hsvHeight"
|
||||||
|
android:layout_toRightOf="@id/ambilwarna_viewSatBri"
|
||||||
|
android:layout_marginLeft="@dimen/ambilwarna_spacer"
|
||||||
|
android:src="@drawable/ambilwarna_hue"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_cursor"
|
||||||
|
android:layout_width="9dp"
|
||||||
|
android:layout_height="9dp"
|
||||||
|
android:src="@drawable/ambilwarna_cursor"
|
||||||
|
android:scaleType="matrix"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_target"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:src="@drawable/ambilwarna_target"
|
||||||
|
android:scaleType="matrix"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
</RelativeLayout>
|
78
third-party/AmbilWarna/res/layout/ambilwarna_dialog.xml
vendored
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/ambilwarna_dialogView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center" >
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/ambilwarna_viewContainer"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:paddingBottom="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingLeft="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingRight="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingTop="@dimen/ambilwarna_spacer" android:layout_gravity="center">
|
||||||
|
|
||||||
|
<yuku.ambilwarna.AmbilWarnaKotak
|
||||||
|
android:id="@+id/ambilwarna_viewSatBri"
|
||||||
|
android:layout_width="@dimen/ambilwarna_hsvWidth"
|
||||||
|
android:layout_height="@dimen/ambilwarna_hsvHeight"
|
||||||
|
android:layerType="software" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_viewHue"
|
||||||
|
android:layout_width="@dimen/ambilwarna_hueWidth"
|
||||||
|
android:layout_height="@dimen/ambilwarna_hsvHeight"
|
||||||
|
android:layout_marginLeft="@dimen/ambilwarna_spacer"
|
||||||
|
android:layout_toRightOf="@id/ambilwarna_viewSatBri"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ambilwarna_hue" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_cursor"
|
||||||
|
android:layout_width="9dp"
|
||||||
|
android:layout_height="9dp"
|
||||||
|
android:scaleType="matrix"
|
||||||
|
android:src="@drawable/ambilwarna_cursor" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/ambilwarna_target"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:scaleType="matrix"
|
||||||
|
android:src="@drawable/ambilwarna_target" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/ambilwarna_state"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/ambilwarna_viewSatBri"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_marginTop="@dimen/ambilwarna_spacer"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal" >
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/ambilwarna_warnaLama"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:background="#faa" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingLeft="@dimen/ambilwarna_spacer"
|
||||||
|
android:paddingRight="@dimen/ambilwarna_spacer"
|
||||||
|
android:src="@drawable/ambilwarna_arrow_right" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/ambilwarna_warnaBaru"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:background="#aaf" />
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</FrameLayout>
|
10
third-party/AmbilWarna/res/layout/ambilwarna_pref_widget.xml
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<yuku.ambilwarna.widget.AmbilWarnaPrefWidgetView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/ambilwarna_pref_widget_kotak"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginRight="6dp"
|
||||||
|
android:focusable="false"
|
||||||
|
android:clickable="false" />
|
5
third-party/AmbilWarna/res/values-land/dimen.xml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
|
||||||
|
<dimen name="ambilwarna_hsvHeight">120dp</dimen>
|
||||||
|
</resources>
|
5
third-party/AmbilWarna/res/values-xlarge-land/dimen.xml
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
|
||||||
|
<dimen name="ambilwarna_hsvHeight">240dp</dimen>
|
||||||
|
</resources>
|
7
third-party/AmbilWarna/res/values/dimen.xml
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<dimen name="ambilwarna_hsvHeight">240dp</dimen>
|
||||||
|
<dimen name="ambilwarna_hsvWidth">240dp</dimen>
|
||||||
|
<dimen name="ambilwarna_hueWidth">30dp</dimen>
|
||||||
|
<dimen name="ambilwarna_spacer">8dp</dimen>
|
||||||
|
</resources>
|
198
third-party/AmbilWarna/src/yuku/ambilwarna/AmbilWarnaDialog.java
vendored
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
package yuku.ambilwarna;
|
||||||
|
|
||||||
|
import android.app.*;
|
||||||
|
import android.content.*;
|
||||||
|
import android.content.DialogInterface.OnCancelListener;
|
||||||
|
import android.graphics.*;
|
||||||
|
import android.view.*;
|
||||||
|
import android.widget.*;
|
||||||
|
|
||||||
|
public class AmbilWarnaDialog {
|
||||||
|
public interface OnAmbilWarnaListener {
|
||||||
|
void onCancel(AmbilWarnaDialog dialog);
|
||||||
|
void onOk(AmbilWarnaDialog dialog, int color);
|
||||||
|
}
|
||||||
|
|
||||||
|
final AlertDialog dialog;
|
||||||
|
final OnAmbilWarnaListener listener;
|
||||||
|
final View viewHue;
|
||||||
|
final AmbilWarnaKotak viewSatVal;
|
||||||
|
final ImageView viewCursor;
|
||||||
|
final View viewOldColor;
|
||||||
|
final View viewNewColor;
|
||||||
|
final ImageView viewTarget;
|
||||||
|
final ViewGroup viewContainer;
|
||||||
|
final float[] currentColorHsv = new float[3];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create an AmbilWarnaDialog. call this only from OnCreateDialog() or from a background thread.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* current context
|
||||||
|
* @param color
|
||||||
|
* current color
|
||||||
|
* @param listener
|
||||||
|
* an OnAmbilWarnaListener, allowing you to get back error or
|
||||||
|
*/
|
||||||
|
public AmbilWarnaDialog(final Context context, int color, OnAmbilWarnaListener listener) {
|
||||||
|
this.listener = listener;
|
||||||
|
Color.colorToHSV(color, currentColorHsv);
|
||||||
|
|
||||||
|
final View view = LayoutInflater.from(context).inflate(R.layout.ambilwarna_dialog, null);
|
||||||
|
viewHue = view.findViewById(R.id.ambilwarna_viewHue);
|
||||||
|
viewSatVal = (AmbilWarnaKotak) view.findViewById(R.id.ambilwarna_viewSatBri);
|
||||||
|
viewCursor = (ImageView) view.findViewById(R.id.ambilwarna_cursor);
|
||||||
|
viewOldColor = view.findViewById(R.id.ambilwarna_warnaLama);
|
||||||
|
viewNewColor = view.findViewById(R.id.ambilwarna_warnaBaru);
|
||||||
|
viewTarget = (ImageView) view.findViewById(R.id.ambilwarna_target);
|
||||||
|
viewContainer = (ViewGroup) view.findViewById(R.id.ambilwarna_viewContainer);
|
||||||
|
|
||||||
|
viewSatVal.setHue(getHue());
|
||||||
|
viewOldColor.setBackgroundColor(color);
|
||||||
|
viewNewColor.setBackgroundColor(color);
|
||||||
|
|
||||||
|
viewHue.setOnTouchListener(new View.OnTouchListener() {
|
||||||
|
@Override public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_MOVE
|
||||||
|
|| event.getAction() == MotionEvent.ACTION_DOWN
|
||||||
|
|| event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
|
|
||||||
|
float y = event.getY();
|
||||||
|
if (y < 0.f) y = 0.f;
|
||||||
|
if (y > viewHue.getMeasuredHeight()) y = viewHue.getMeasuredHeight() - 0.001f; // to avoid looping from end to start.
|
||||||
|
float hue = 360.f - 360.f / viewHue.getMeasuredHeight() * y;
|
||||||
|
if (hue == 360.f) hue = 0.f;
|
||||||
|
setHue(hue);
|
||||||
|
|
||||||
|
// update view
|
||||||
|
viewSatVal.setHue(getHue());
|
||||||
|
moveCursor();
|
||||||
|
viewNewColor.setBackgroundColor(getColor());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
viewSatVal.setOnTouchListener(new View.OnTouchListener() {
|
||||||
|
@Override public boolean onTouch(View v, MotionEvent event) {
|
||||||
|
if (event.getAction() == MotionEvent.ACTION_MOVE
|
||||||
|
|| event.getAction() == MotionEvent.ACTION_DOWN
|
||||||
|
|| event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
|
|
||||||
|
float x = event.getX(); // touch event are in dp units.
|
||||||
|
float y = event.getY();
|
||||||
|
|
||||||
|
if (x < 0.f) x = 0.f;
|
||||||
|
if (x > viewSatVal.getMeasuredWidth()) x = viewSatVal.getMeasuredWidth();
|
||||||
|
if (y < 0.f) y = 0.f;
|
||||||
|
if (y > viewSatVal.getMeasuredHeight()) y = viewSatVal.getMeasuredHeight();
|
||||||
|
|
||||||
|
setSat(1.f / viewSatVal.getMeasuredWidth() * x);
|
||||||
|
setVal(1.f - (1.f / viewSatVal.getMeasuredHeight() * y));
|
||||||
|
|
||||||
|
// update view
|
||||||
|
moveTarget();
|
||||||
|
viewNewColor.setBackgroundColor(getColor());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog = new AlertDialog.Builder(context)
|
||||||
|
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
|
||||||
|
@Override public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (AmbilWarnaDialog.this.listener != null) {
|
||||||
|
AmbilWarnaDialog.this.listener.onOk(AmbilWarnaDialog.this, getColor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
|
||||||
|
@Override public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (AmbilWarnaDialog.this.listener != null) {
|
||||||
|
AmbilWarnaDialog.this.listener.onCancel(AmbilWarnaDialog.this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setOnCancelListener(new OnCancelListener() {
|
||||||
|
// if back button is used, call back our listener.
|
||||||
|
@Override public void onCancel(DialogInterface paramDialogInterface) {
|
||||||
|
if (AmbilWarnaDialog.this.listener != null) {
|
||||||
|
AmbilWarnaDialog.this.listener.onCancel(AmbilWarnaDialog.this);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.create();
|
||||||
|
// kill all padding from the dialog window
|
||||||
|
dialog.setView(view, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
// move cursor & target on first draw
|
||||||
|
ViewTreeObserver vto = view.getViewTreeObserver();
|
||||||
|
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||||
|
@Override public void onGlobalLayout() {
|
||||||
|
moveCursor();
|
||||||
|
moveTarget();
|
||||||
|
view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void moveCursor() {
|
||||||
|
float y = viewHue.getMeasuredHeight() - (getHue() * viewHue.getMeasuredHeight() / 360.f);
|
||||||
|
if (y == viewHue.getMeasuredHeight()) y = 0.f;
|
||||||
|
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) viewCursor.getLayoutParams();
|
||||||
|
layoutParams.leftMargin = (int) (viewHue.getLeft() - Math.floor(viewCursor.getMeasuredWidth() / 2) - viewContainer.getPaddingLeft());
|
||||||
|
;
|
||||||
|
layoutParams.topMargin = (int) (viewHue.getTop() + y - Math.floor(viewCursor.getMeasuredHeight() / 2) - viewContainer.getPaddingTop());
|
||||||
|
;
|
||||||
|
viewCursor.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void moveTarget() {
|
||||||
|
float x = getSat() * viewSatVal.getMeasuredWidth();
|
||||||
|
float y = (1.f - getVal()) * viewSatVal.getMeasuredHeight();
|
||||||
|
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) viewTarget.getLayoutParams();
|
||||||
|
layoutParams.leftMargin = (int) (viewSatVal.getLeft() + x - Math.floor(viewTarget.getMeasuredWidth() / 2) - viewContainer.getPaddingLeft());
|
||||||
|
layoutParams.topMargin = (int) (viewSatVal.getTop() + y - Math.floor(viewTarget.getMeasuredHeight() / 2) - viewContainer.getPaddingTop());
|
||||||
|
viewTarget.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getColor() {
|
||||||
|
return Color.HSVToColor(currentColorHsv);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getHue() {
|
||||||
|
return currentColorHsv[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getSat() {
|
||||||
|
return currentColorHsv[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
private float getVal() {
|
||||||
|
return currentColorHsv[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHue(float hue) {
|
||||||
|
currentColorHsv[0] = hue;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSat(float sat) {
|
||||||
|
currentColorHsv[1] = sat;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setVal(float val) {
|
||||||
|
currentColorHsv[2] = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void show() {
|
||||||
|
dialog.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AlertDialog getDialog() {
|
||||||
|
return dialog;
|
||||||
|
}
|
||||||
|
}
|
46
third-party/AmbilWarna/src/yuku/ambilwarna/AmbilWarnaKotak.java
vendored
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
package yuku.ambilwarna;
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.ComposeShader;
|
||||||
|
import android.graphics.LinearGradient;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
import android.graphics.Shader;
|
||||||
|
import android.graphics.Shader.TileMode;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class AmbilWarnaKotak extends View {
|
||||||
|
Paint paint;
|
||||||
|
Shader luar;
|
||||||
|
final float[] color = { 1.f, 1.f, 1.f };
|
||||||
|
|
||||||
|
public AmbilWarnaKotak(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AmbilWarnaKotak(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
if (paint == null) {
|
||||||
|
paint = new Paint();
|
||||||
|
luar = new LinearGradient(0.f, 0.f, 0.f, this.getMeasuredHeight(), 0xffffffff, 0xff000000, TileMode.CLAMP);
|
||||||
|
}
|
||||||
|
int rgb = Color.HSVToColor(color);
|
||||||
|
Shader dalam = new LinearGradient(0.f, 0.f, this.getMeasuredWidth(), 0.f, 0xffffffff, rgb, TileMode.CLAMP);
|
||||||
|
ComposeShader shader = new ComposeShader(luar, dalam, PorterDuff.Mode.MULTIPLY);
|
||||||
|
paint.setShader(shader);
|
||||||
|
canvas.drawRect(0.f, 0.f, this.getMeasuredWidth(), this.getMeasuredHeight(), paint);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHue(float hue) {
|
||||||
|
color[0] = hue;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
45
third-party/AmbilWarna/src/yuku/ambilwarna/widget/AmbilWarnaPrefWidgetView.java
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package yuku.ambilwarna.widget;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Paint.Style;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.util.FloatMath;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
public class AmbilWarnaPrefWidgetView extends View {
|
||||||
|
Paint paint;
|
||||||
|
float rectSize;
|
||||||
|
float strokeWidth;
|
||||||
|
|
||||||
|
boolean drawCross;
|
||||||
|
|
||||||
|
public AmbilWarnaPrefWidgetView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
|
||||||
|
float density = context.getResources().getDisplayMetrics().density;
|
||||||
|
rectSize = FloatMath.floor(24.f * density + 0.5f);
|
||||||
|
strokeWidth = FloatMath.floor(1.f * density + 0.5f);
|
||||||
|
|
||||||
|
paint = new Paint();
|
||||||
|
paint.setColor(0xffffffff);
|
||||||
|
paint.setStyle(Style.STROKE);
|
||||||
|
paint.setStrokeWidth(strokeWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showCross(boolean show) {
|
||||||
|
drawCross = show;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDraw(Canvas canvas) {
|
||||||
|
super.onDraw(canvas);
|
||||||
|
|
||||||
|
canvas.drawRect(strokeWidth, strokeWidth, rectSize - strokeWidth, rectSize - strokeWidth, paint);
|
||||||
|
if (drawCross) {
|
||||||
|
canvas.drawLine(strokeWidth, strokeWidth, rectSize - strokeWidth, rectSize - strokeWidth, paint);
|
||||||
|
canvas.drawLine(strokeWidth, rectSize - strokeWidth, rectSize - strokeWidth, strokeWidth, paint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
129
third-party/AmbilWarna/src/yuku/ambilwarna/widget/AmbilWarnaPreference.java
vendored
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
package yuku.ambilwarna.widget;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.os.Parcel;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.preference.Preference;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import yuku.ambilwarna.AmbilWarnaDialog;
|
||||||
|
import yuku.ambilwarna.R;
|
||||||
|
|
||||||
|
public class AmbilWarnaPreference extends Preference {
|
||||||
|
int value;
|
||||||
|
|
||||||
|
public AmbilWarnaPreference(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
setWidgetLayoutResource(R.layout.ambilwarna_pref_widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void onBindView(View view) {
|
||||||
|
super.onBindView(view);
|
||||||
|
|
||||||
|
// Set our custom views inside the layout
|
||||||
|
final View kotak = view.findViewById(R.id.ambilwarna_pref_widget_kotak);
|
||||||
|
if (kotak != null) {
|
||||||
|
kotak.setBackgroundColor(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void onClick() {
|
||||||
|
new AmbilWarnaDialog(getContext(), value, new AmbilWarnaDialog.OnAmbilWarnaListener() {
|
||||||
|
@Override public void onOk(AmbilWarnaDialog dialog, int color) {
|
||||||
|
if (!callChangeListener(color)) return; // They don't want the value to be set
|
||||||
|
value = color;
|
||||||
|
persistInt(value);
|
||||||
|
notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void onCancel(AmbilWarnaDialog dialog) {
|
||||||
|
// nothing to do
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void forceSetValue(int value) {
|
||||||
|
this.value = value;
|
||||||
|
persistInt(value);
|
||||||
|
notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected Object onGetDefaultValue(TypedArray a, int index) {
|
||||||
|
// This preference type's value type is Integer, so we read the default value from the attributes as an Integer.
|
||||||
|
return a.getInteger(index, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
|
||||||
|
if (restoreValue) { // Restore state
|
||||||
|
value = getPersistedInt(value);
|
||||||
|
} else { // Set state
|
||||||
|
int value = (Integer) defaultValue;
|
||||||
|
this.value = value;
|
||||||
|
persistInt(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Suppose a client uses this preference type without persisting. We
|
||||||
|
* must save the instance state so it is able to, for example, survive
|
||||||
|
* orientation changes.
|
||||||
|
*/
|
||||||
|
@Override protected Parcelable onSaveInstanceState() {
|
||||||
|
final Parcelable superState = super.onSaveInstanceState();
|
||||||
|
if (isPersistent()) return superState; // No need to save instance state since it's persistent
|
||||||
|
|
||||||
|
final SavedState myState = new SavedState(superState);
|
||||||
|
myState.value = value;
|
||||||
|
return myState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void onRestoreInstanceState(Parcelable state) {
|
||||||
|
if (!state.getClass().equals(SavedState.class)) {
|
||||||
|
// Didn't save state for us in onSaveInstanceState
|
||||||
|
super.onRestoreInstanceState(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore the instance state
|
||||||
|
SavedState myState = (SavedState) state;
|
||||||
|
super.onRestoreInstanceState(myState.getSuperState());
|
||||||
|
this.value = myState.value;
|
||||||
|
notifyChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SavedState, a subclass of {@link BaseSavedState}, will store the state
|
||||||
|
* of MyPreference, a subclass of Preference.
|
||||||
|
* <p>
|
||||||
|
* It is important to always call through to super methods.
|
||||||
|
*/
|
||||||
|
private static class SavedState extends BaseSavedState {
|
||||||
|
int value;
|
||||||
|
|
||||||
|
public SavedState(Parcel source) {
|
||||||
|
super(source);
|
||||||
|
value = source.readInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void writeToParcel(Parcel dest, int flags) {
|
||||||
|
super.writeToParcel(dest, flags);
|
||||||
|
dest.writeInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SavedState(Parcelable superState) {
|
||||||
|
super(superState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused") public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
|
||||||
|
public SavedState createFromParcel(Parcel in) {
|
||||||
|
return new SavedState(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SavedState[] newArray(int size) {
|
||||||
|
return new SavedState[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|