From a32a2db69e8c4978048216ab7ebfcf52dd4f5103 Mon Sep 17 00:00:00 2001 From: zhangyi <3232645369@qq.com> Date: Fri, 13 Dec 2024 11:16:57 +0800 Subject: [PATCH 1/6] first --- doc/test.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/test.txt diff --git a/doc/test.txt b/doc/test.txt new file mode 100644 index 0000000..e69de29 -- 2.34.1 From cab73dbd607f0ab5e423883af6d228d689c456d1 Mon Sep 17 00:00:00 2001 From: zhangyi <3232645369@qq.com> Date: Fri, 13 Dec 2024 11:30:54 +0800 Subject: [PATCH 2/6] picture --- doc/小米便签成功截图.png | Bin 0 -> 408936 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/小米便签成功截图.png diff --git a/doc/小米便签成功截图.png b/doc/小米便签成功截图.png new file mode 100644 index 0000000000000000000000000000000000000000..6be1e6c70e93165487dbc494bcd2c3e8247d423c GIT binary patch literal 408936 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�JeLwkB3dW_P}Z&FVe`Uiml%9Asqh(m9=WZi!6NP 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�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 z

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%0Dj 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%0Aq{O-Z@Aw*d+3vk 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 Date: Fri, 13 Dec 2024 15:57:12 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=B0=8F=E7=B1=B3=E4=BE=BF=E7=AD=BE?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/notes/MainActivity.java | 24 + doc/notes/data/Contact.java | 86 ++ doc/notes/data/Notes.java | 169 ++++ doc/notes/data/NotesDatabaseHelper.java | 210 ++++ doc/notes/data/NotesProvider.java | 357 +++++++ doc/notes/gtask/data/MetaData.java | 89 ++ doc/notes/gtask/data/Node.java | 116 +++ doc/notes/gtask/data/SqlData.java | 189 ++++ doc/notes/gtask/data/SqlNote.java | 505 +++++++++ doc/notes/gtask/data/Task.java | 351 +++++++ doc/notes/gtask/data/TaskList.java | 343 +++++++ .../exception/ActionFailureException.java | 33 + .../exception/NetworkFailureException.java | 33 + doc/notes/gtask/remote/GTaskASyncTask.java | 124 +++ doc/notes/gtask/remote/GTaskClient.java | 585 +++++++++++ doc/notes/gtask/remote/GTaskManager.java | 800 +++++++++++++++ doc/notes/gtask/remote/GTaskSyncService.java | 128 +++ doc/notes/model/Note.java | 253 +++++ doc/notes/model/WorkingNote.java | 368 +++++++ doc/notes/tool/BackupUtils.java | 344 +++++++ doc/notes/tool/DataUtils.java | 295 ++++++ doc/notes/tool/GTaskStringUtils.java | 113 +++ doc/notes/tool/ResourceParser.java | 181 ++++ doc/notes/ui/AlarmAlertActivity.java | 158 +++ doc/notes/ui/AlarmInitReceiver.java | 65 ++ doc/notes/ui/AlarmReceiver.java | 30 + doc/notes/ui/DateTimePicker.java | 485 +++++++++ doc/notes/ui/DateTimePickerDialog.java | 90 ++ doc/notes/ui/DropdownMenu.java | 61 ++ doc/notes/ui/FoldersListAdapter.java | 80 ++ doc/notes/ui/NoteEditActivity.java | 873 ++++++++++++++++ doc/notes/ui/NoteEditText.java | 217 ++++ doc/notes/ui/NoteItemData.java | 224 ++++ doc/notes/ui/NotesListActivity.java | 954 ++++++++++++++++++ doc/notes/ui/NotesListAdapter.java | 184 ++++ doc/notes/ui/NotesListItem.java | 122 +++ doc/notes/ui/NotesPreferenceActivity.java | 388 +++++++ doc/notes/widget/NoteWidgetProvider.java | 132 +++ doc/notes/widget/NoteWidgetProvider_2x.java | 47 + doc/notes/widget/NoteWidgetProvider_4x.java | 46 + doc/test.txt | 0 41 files changed, 9852 insertions(+) create mode 100644 doc/notes/MainActivity.java create mode 100644 doc/notes/data/Contact.java create mode 100644 doc/notes/data/Notes.java create mode 100644 doc/notes/data/NotesDatabaseHelper.java create mode 100644 doc/notes/data/NotesProvider.java create mode 100644 doc/notes/gtask/data/MetaData.java create mode 100644 doc/notes/gtask/data/Node.java create mode 100644 doc/notes/gtask/data/SqlData.java create mode 100644 doc/notes/gtask/data/SqlNote.java create mode 100644 doc/notes/gtask/data/Task.java create mode 100644 doc/notes/gtask/data/TaskList.java create mode 100644 doc/notes/gtask/exception/ActionFailureException.java create mode 100644 doc/notes/gtask/exception/NetworkFailureException.java create mode 100644 doc/notes/gtask/remote/GTaskASyncTask.java create mode 100644 doc/notes/gtask/remote/GTaskClient.java create mode 100644 doc/notes/gtask/remote/GTaskManager.java create mode 100644 doc/notes/gtask/remote/GTaskSyncService.java create mode 100644 doc/notes/model/Note.java create mode 100644 doc/notes/model/WorkingNote.java create mode 100644 doc/notes/tool/BackupUtils.java create mode 100644 doc/notes/tool/DataUtils.java create mode 100644 doc/notes/tool/GTaskStringUtils.java create mode 100644 doc/notes/tool/ResourceParser.java create mode 100644 doc/notes/ui/AlarmAlertActivity.java create mode 100644 doc/notes/ui/AlarmInitReceiver.java create mode 100644 doc/notes/ui/AlarmReceiver.java create mode 100644 doc/notes/ui/DateTimePicker.java create mode 100644 doc/notes/ui/DateTimePickerDialog.java create mode 100644 doc/notes/ui/DropdownMenu.java create mode 100644 doc/notes/ui/FoldersListAdapter.java create mode 100644 doc/notes/ui/NoteEditActivity.java create mode 100644 doc/notes/ui/NoteEditText.java create mode 100644 doc/notes/ui/NoteItemData.java create mode 100644 doc/notes/ui/NotesListActivity.java create mode 100644 doc/notes/ui/NotesListAdapter.java create mode 100644 doc/notes/ui/NotesListItem.java create mode 100644 doc/notes/ui/NotesPreferenceActivity.java create mode 100644 doc/notes/widget/NoteWidgetProvider.java create mode 100644 doc/notes/widget/NoteWidgetProvider_2x.java create mode 100644 doc/notes/widget/NoteWidgetProvider_4x.java delete mode 100644 doc/test.txt diff --git a/doc/notes/MainActivity.java b/doc/notes/MainActivity.java new file mode 100644 index 0000000..8091753 --- /dev/null +++ b/doc/notes/MainActivity.java @@ -0,0 +1,24 @@ +package net.micode.notes; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_main); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/doc/notes/data/Contact.java b/doc/notes/data/Contact.java new file mode 100644 index 0000000..b658581 --- /dev/null +++ b/doc/notes/data/Contact.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.content.Context; +import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Data; +import android.telephony.PhoneNumberUtils; +import android.util.Log; + +import java.util.HashMap; + +// Contact类用于获取与电话号码关联的联系人姓名 +public class Contact { + // 缓存已查询的电话号码和对应的联系人姓名 + private static HashMap sContactCache; + // 日志标签,用于调试和错误日志 + private static final String TAG = "Contact"; + + // 用于查询联系人的SQL选择语句,其中"+"将被替换为电话号码的最小匹配值 + private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + + "(SELECT raw_contact_id " + + " FROM phone_lookup" + + " WHERE min_match = '+')"; + + // 根据电话号码获取联系人姓名的方法 + public static String getContact(Context context, String phoneNumber) { + // 如果缓存为空,则初始化缓存 + if(sContactCache == null) { + sContactCache = new HashMap(); + } + + // 如果缓存中已存在该电话号码对应的联系人姓名,则直接返回 + if(sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber); + } + + // 替换SQL选择语句中的"+"为电话号码的最小匹配值 + String selection = CALLER_ID_SELECTION.replace("+", + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // 查询联系人数据 + Cursor cursor = context.getContentResolver().query( + Data.CONTENT_URI, + new String [] { Phone.DISPLAY_NAME }, // 查询联系人姓名 + selection, + new String[] { phoneNumber }, // 查询条件为电话号码 + null); + + // 如果查询结果不为空且能够移动到第一条记录,则获取联系人姓名 + if (cursor != null && cursor.moveToFirst()) { + try { + String name = cursor.getString(0); // 获取联系人姓名 + sContactCache.put(phoneNumber, name); // 将结果存入缓存 + return name; + } catch (IndexOutOfBoundsException e) { + // 如果发生异常,记录错误日志并返回null + Log.e(TAG, " Cursor get string error " + e.toString()); + return null; + } finally { + cursor.close(); // 关闭游标释放资源 + } + } else { + // 如果没有找到匹配的联系人,记录调试信息并返回null + Log.d(TAG, "No contact matched with number:" + phoneNumber); + return null; + } + } +} + diff --git a/doc/notes/data/Notes.java b/doc/notes/data/Notes.java new file mode 100644 index 0000000..53ca199 --- /dev/null +++ b/doc/notes/data/Notes.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.net.Uri; + +// Notes类,用于定义笔记应用中的常量和接口 +public class Notes { + // 内容提供者的Authority + public static final String AUTHORITY = "micode_notes"; + // 日志标签 + public static final String TAG = "Notes"; + + // 笔记类型常量 + public static final int TYPE_NOTE = 0; // 普通笔记 + public static final int TYPE_FOLDER = 1; // 文件夹 + public static final int TYPE_SYSTEM = 2; // 系统文件夹 + + // 系统文件夹ID常量 + public static final int ID_ROOT_FOLDER = 0; // 根文件夹 + public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹,用于存放不属于任何文件夹的笔记 + public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹 + public static final int ID_TRASH_FOLER = -3; // 垃圾箱文件夹 + + // Intent额外的键 + public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; // 提醒日期 + public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; // 背景颜色ID + public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; // 小部件ID + public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; // 小部件类型 + public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; // 文件夹ID + public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; // 通话日期 + + // 小部件类型常量 + public static final int TYPE_WIDGET_INVALIDE = -1; // 无效小部件 + public static final int TYPE_WIDGET_2X = 0; // 2x小部件 + public static final int TYPE_WIDGET_4X = 1; // 4x小部件 + + // 数据常量类 + public static class DataConstants { + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 文本笔记 + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话记录笔记 + } + + // 查询所有笔记和文件夹的Uri + public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); + + // 查询数据的Uri + public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + + // 笔记列接口 + public interface NoteColumns { + // 唯一ID + public static final String ID = "_id"; + + // 父级ID + public static final String PARENT_ID = "parent_id"; + + // 创建日期 + public static final String CREATED_DATE = "created_date"; + + // 最后修改日期 + public static final String MODIFIED_DATE = "modified_date"; + + // 提醒日期 + public static final String ALERTED_DATE = "alert_date"; + + // 文件夹名称或笔记文本内容 + public static final String SNIPPET = "snippet"; + + // 笔记小部件ID + public static final String WIDGET_ID = "widget_id"; + + // 笔记小部件类型 + public static final String WIDGET_TYPE = "widget_type"; + + // 笔记背景颜色ID + public static final String BG_COLOR_ID = "bg_color_id"; + + // 笔记是否有附件 + public static final String HAS_ATTACHMENT = "has_attachment"; + + // 文件夹中的笔记数量 + public static final String NOTES_COUNT = "notes_count"; + + // 文件类型:文件夹或笔记 + public static final String TYPE = "type"; + + // 最后同步ID + public static final String SYNC_ID = "sync_id"; + + // 本地修改标志 + public static final String LOCAL_MODIFIED = "local_modified"; + + // 移动到临时文件夹前的原始父ID列 + public static final String ORIGIN_PARENT_ID = "origin_parent_id"; + // GTask ID列 + public static final String GTASK_ID = "gtask_id"; + // 版本号列 + public static final String VERSION = "version"; + } + + // 数据列接口,定义了数据表的列名和类型 + public interface DataColumns { + // 唯一ID列 + public static final String ID = "_id"; + // MIME类型列 + public static final String MIME_TYPE = "mime_type"; + // 笔记ID列 + public static final String NOTE_ID = "note_id"; + // 创建日期列 + public static final String CREATED_DATE = "created_date"; + // 最后修改日期列 + public static final String MODIFIED_DATE = "modified_date"; + // 数据的内容 + public static final String CONTENT = "content"; + // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 + public static final String DATA1 = "data1"; + // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 + public static final String DATA2 = "data2"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA3 = "data3"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA4 = "data4"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA5 = "data5"; + } + + // TextNote类实现了DataColumns接口,定义了文本笔记的相关常量 + public static final class TextNote implements DataColumns { + // 模式,用于指示文本是否处于复选框列表模式 + public static final String MODE = DATA1; + // 复选框列表模式常量 + public static final int MODE_CHECK_LIST = 1; + // 内容类型常量,用于目录 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; + // 内容项类型常量,用于单个项目 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; + // 内容URI,用于访问文本笔记的数据 + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); + } + + // CallNote类实现了DataColumns接口,定义了通话笔记的相关常量 + public static final class CallNote implements DataColumns { + // 通话日期列 + public static final String CALL_DATE = DATA1; + // 电话号码列 + public static final String PHONE_NUMBER = DATA3; + // 内容类型常量,用于目录 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; + // 内容项类型常量,用于单个项目 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; + // 内容URI,用于访问通话笔记的数据 + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); + } +} diff --git a/doc/notes/data/NotesDatabaseHelper.java b/doc/notes/data/NotesDatabaseHelper.java new file mode 100644 index 0000000..d380033 --- /dev/null +++ b/doc/notes/data/NotesDatabaseHelper.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.content.ContentValues; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; + + +// NotesDatabaseHelper类扩展了SQLiteOpenHelper,用于管理数据库的创建和版本管理 +public class NotesDatabaseHelper extends SQLiteOpenHelper { + // 数据库文件名 + private static final String DB_NAME = "note.db"; + // 数据库版本号 + private static final int DB_VERSION = 4; + + // TABLE接口定义了数据库中的表名常量 + public interface TABLE { + public static final String NOTE = "note"; // 笔记表 + public static final String DATA = "data"; // 数据表 + } + + // 日志标签,用于调试和错误日志 + private static final String TAG = "NotesDatabaseHelper"; + + // 单例模式的数据库助手实例 + private static NotesDatabaseHelper mInstance; + + // 创建笔记表的SQL语句 + private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(...)"; + // 创建数据表的SQL语句 + private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(...)"; + // 创建数据表上笔记ID索引的SQL语句 + private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(...);"; + + // 定义了多个触发器,用于在笔记表和数据表上的操作后自动更新相关数据 + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update ..."; + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update ..."; + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert ..."; + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete ..."; + private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete ..."; + private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete ..."; + private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash ..."; + + // 构造函数,初始化数据库助手 + public NotesDatabaseHelper(Context context) { + super(context, DB_NAME, null, DB_VERSION); + } + + // 创建笔记表及其触发器 + public void createNoteTable(SQLiteDatabase db) { + db.execSQL(CREATE_NOTE_TABLE_SQL); + reCreateNoteTableTriggers(db); + createSystemFolder(db); + Log.d(TAG, "note table has been created"); + } + + // 重新创建笔记表的触发器 + private void reCreateNoteTableTriggers(SQLiteDatabase db) { + // 删除旧的触发器 + db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); + // ... 其他触发器删除代码 ... + // 创建新的触发器 + db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); + // ... 其他触发器创建代码 ... + } + + // 创建系统文件夹 + private void createSystemFolder(SQLiteDatabase db) { + ContentValues values = new ContentValues(); + // 创建通话记录文件夹 + values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); + // ... 其他系统文件夹创建代码 ... + } + + // 创建数据表及其触发器 + public void createDataTable(SQLiteDatabase db) { + db.execSQL(CREATE_DATA_TABLE_SQL); + reCreateDataTableTriggers(db); + db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); + Log.d(TAG, "data table has been created"); + } + + // 重新创建数据表的触发器,删除旧的触发器并创建新的触发器 + private void reCreateDataTableTriggers(SQLiteDatabase db) { + // 删除如果存在的话,插入数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); + // 删除如果存在的话,更新数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); + // 删除如果存在的话,删除数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); + + // 创建新的触发器,用于在插入数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); + // 创建新的触发器,用于在更新数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); + // 创建新的触发器,用于在删除数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); + } + + // 获取NotesDatabaseHelper的单例实例 + static synchronized NotesDatabaseHelper getInstance(Context context) { + // 如果单例实例为空,则创建一个新的实例 + if (mInstance == null) { + mInstance = new NotesDatabaseHelper(context); + } + // 返回单例实例 + return mInstance; + } + + // 当数据库被创建时调用此方法 + @Override + public void onCreate(SQLiteDatabase db) { + // 创建笔记表和数据表 + createNoteTable(db); + createDataTable(db); + } + + // 当数据库需要升级时调用此方法 + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + boolean reCreateTriggers = false; // 标记是否需要重新创建触发器 + boolean skipV2 = false; // 标记是否跳过版本2的升级 + + // 如果当前版本是1,则升级到版本2 + if (oldVersion == 1) { + upgradeToV2(db); + skipV2 = true; // 包含从版本2到版本3的升级 + oldVersion++; + } + + // 如果当前版本是2且没有跳过版本2的升级,则升级到版本3 + if (oldVersion == 2 && !skipV2) { + upgradeToV3(db); + reCreateTriggers = true; // 需要重新创建触发器 + oldVersion++; + } + + // 如果当前版本是3,则升级到版本4 + if (oldVersion == 3) { + upgradeToV4(db); + oldVersion++; + } + + // 如果需要重新创建触发器,则执行相关操作 + if (reCreateTriggers) { + reCreateNoteTableTriggers(db); + reCreateDataTableTriggers(db); + } + + // 如果版本号不匹配,抛出异常 + if (oldVersion != newVersion) { + throw new IllegalStateException("Upgrade notes database to version " + newVersion + " fails"); + } + } + + // 升级数据库到版本2 + private void upgradeToV2(SQLiteDatabase db) { + // 删除旧的笔记表和数据表 + db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); + // 创建新的笔记表和数据表 + createNoteTable(db); + createDataTable(db); + } + + // 升级数据库到版本3 + private void upgradeToV3(SQLiteDatabase db) { + // 删除不再使用的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); + // 添加用于GTasks的ID列 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''"); + // 添加垃圾文件夹 + ContentValues values = new ContentValues(); + values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + } + + // 升级数据库到版本4 + private void upgradeToV4(SQLiteDatabase db) { + // 添加版本号列 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); + } +} \ No newline at end of file diff --git a/doc/notes/data/NotesProvider.java b/doc/notes/data/NotesProvider.java new file mode 100644 index 0000000..fe82f49 --- /dev/null +++ b/doc/notes/data/NotesProvider.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + + +import android.app.SearchManager; +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Intent; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; + + +// NotesProvider类继承自ContentProvider,用于提供对笔记数据的访问 +public class NotesProvider extends ContentProvider { + private static final UriMatcher mMatcher; // 用于匹配Uri的UriMatcher + private NotesDatabaseHelper mHelper; // 数据库帮助类实例 + + private static final String TAG = "NotesProvider"; // 日志标签 + + // 定义Uri匹配的常量 + private static final int URI_NOTE = 1; + private static final int URI_NOTE_ITEM = 2; + private static final int URI_DATA = 3; + private static final int URI_DATA_ITEM = 4; + private static final int URI_SEARCH = 5; + private static final int URI_SEARCH_SUGGEST = 6; + + static { + // 初始化UriMatcher并添加Uri匹配规则 + mMatcher = new UriMatcher(UriMatcher.NO_MATCH); + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); + } + + // 定义用于搜索结果的投影,去除换行符并格式化输出 + private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," + + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," + + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + + // 定义搜索查询的SQL语句 + private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + + // ContentProvider创建时调用 + @Override + public boolean onCreate() { + mHelper = NotesDatabaseHelper.getInstance(getContext()); // 获取数据库帮助类的实例 + return true; + } + + // 实现ContentProvider的query方法,用于查询数据 + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + Cursor c = null; // 初始化Cursor对象 + SQLiteDatabase db = mHelper.getReadableDatabase(); // 获取可读数据库实例 + String id = null; // 初始化ID变量,用于存储URI中的ID + + // 根据URI匹配结果执行不同的查询操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,查询笔记表 + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID并查询该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); + break; + case URI_DATA: + // 如果URI匹配到数据列表,查询数据表 + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并查询该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); + break; + case URI_SEARCH: + case URI_SEARCH_SUGGEST: + // 如果URI匹配到搜索或搜索建议,执行搜索查询 + if (sortOrder != null || projection != null) { + // 如果提供了排序或投影参数,抛出异常,因为这些参数不应该用于搜索查询 + throw new IllegalArgumentException( + "do not specify sortOrder, selection, selectionArgs, or projection with this query"); + } + + // 获取搜索字符串 + String searchString = null; + if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { + // 如果是搜索建议,从URI中获取搜索字符串 + if (uri.getPathSegments().size() > 1) { + searchString = uri.getPathSegments().get(1); + } + } else { + // 如果是普通搜索,从URI的查询参数中获取搜索字符串 + searchString = uri.getQueryParameter("pattern"); + } + + // 如果搜索字符串为空,返回null + if (TextUtils.isEmpty(searchString)) { + return null; + } + + // 格式化搜索字符串并执行搜索查询 + try { + searchString = String.format("%%%s%%", searchString); + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[]{searchString}); + } catch (IllegalStateException ex) { + // 如果发生异常,记录日志 + Log.e(TAG, "got exception: " + ex.toString()); + } + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果Cursor不为空,设置通知URI + if (c != null) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; // 返回Cursor对象 + } + + // 实现ContentProvider的insert方法,用于插入数据 + @Override + public Uri insert(Uri uri, ContentValues values) { + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + long dataId = 0, noteId = 0, insertedId = 0; // 初始化ID变量 + + // 根据URI匹配结果执行不同的插入操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,插入新笔记 + insertedId = noteId = db.insert(TABLE.NOTE, null, values); // 插入笔记并获取新笔记的ID + break; + case URI_DATA: + // 如果URI匹配到数据列表,插入新数据 + if (values.containsKey(DataColumns.NOTE_ID)) { + // 如果ContentValues包含笔记ID,则获取该ID + noteId = values.getAsLong(DataColumns.NOTE_ID); + } else { + // 如果没有笔记ID,记录调试信息 + Log.d(TAG, "Wrong data format without note id:" + values.toString()); + } + insertedId = dataId = db.insert(TABLE.DATA, null, values); // 插入数据并获取新数据的ID + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果插入的是笔记,通知变更 + if (noteId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); + } + + // 如果插入的是数据,通知变更 + if (dataId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); + } + + // 返回插入数据的URI + return ContentUris.withAppendedId(uri, insertedId); + } + + // 实现ContentProvider的delete方法,用于删除数据 + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + int count = 0; // 初始化删除计数器 + String id = null; // 初始化ID变量 + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + boolean deleteData = false; // 标记是否删除数据 + + // 根据URI匹配结果执行不同的删除操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,删除笔记 + selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; // 确保只删除ID大于0的笔记 + count = db.delete(TABLE.NOTE, selection, selectionArgs); // 执行删除操作并获取删除计数 + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID并删除该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + long noteId = Long.valueOf(id); // 将ID转换为长整型 + if (noteId <= 0) { + // 如果ID小于等于0,表示系统文件夹,不允许删除,直接跳出 + break; + } + count = db.delete(TABLE.NOTE, + NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 + break; + case URI_DATA: + // 如果URI匹配到数据列表,删除数据 + count = db.delete(TABLE.DATA, selection, selectionArgs); // 执行删除操作并获取删除计数 + deleteData = true; // 设置删除数据标记 + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并删除该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + count = db.delete(TABLE.DATA, + DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 + deleteData = true; // 设置删除数据标记 + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果删除了数据,通知变更 + if (count > 0) { + if (deleteData) { + // 如果删除的是数据,通知笔记URI变更 + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + // 通知原始URI变更 + getContext().getContentResolver().notifyChange(uri, null); + } + + // 返回删除的记录数 + return count; + } + + // 实现ContentProvider的update方法,用于更新数据 + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + int count = 0; // 初始化更新计数器 + String id = null; // 初始化ID变量 + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + boolean updateData = false; // 标记是否更新数据 + + // 根据URI匹配结果执行不同的更新操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,增加笔记版本号并更新笔记 + increaseNoteVersion(-1, selection, selectionArgs); // 增加笔记版本号 + count = db.update(TABLE.NOTE, values, selection, selectionArgs); // 执行更新操作并获取更新计数 + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID,增加版本号并更新该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); // 增加笔记版本号 + count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 + break; + case URI_DATA: + // 如果URI匹配到数据列表,更新数据 + count = db.update(TABLE.DATA, values, selection, selectionArgs); // 执行更新操作并获取更新计数 + updateData = true; // 设置更新数据标记 + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并更新该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 + updateData = true; // 设置更新数据标记 + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果更新了数据,通知变更 + if (count > 0) { + if (updateData) { + // 如果更新的是数据,通知笔记URI变更 + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + // 通知原始URI变更 + getContext().getContentResolver().notifyChange(uri, null); + } + + // 返回更新的记录数 + return count; + } + + // 解析选择条件,用于构建SQL语句 + private String parseSelection(String selection) { + return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); + } + + // 增加笔记版本号 + private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { + StringBuilder sql = new StringBuilder(120); // 初始化StringBuilder用于构建SQL语句 + sql.append("UPDATE "); + sql.append(TABLE.NOTE); + sql.append(" SET "); + sql.append(NoteColumns.VERSION); + sql.append("=" + NoteColumns.VERSION + "+1 "); // 增加版本号 + + // 如果有ID或者选择条件,添加WHERE子句 + if (id > 0 || !TextUtils.isEmpty(selection)) { + sql.append(" WHERE "); + } + if (id > 0) { + sql.append(NoteColumns.ID + "=" + String.valueOf(id)); // 如果有ID,添加ID条件 + } + if (!TextUtils.isEmpty(selection)) { + String selectString = id > 0 ? parseSelection(selection) : selection; // 解析选择条件 + for (String args : selectionArgs) { + selectString = selectString.replaceFirst("\\?", args); // 替换选择参数 + } + sql.append(selectString); // 添加选择条件到SQL语句 + } + + mHelper.getWritableDatabase().execSQL(sql.toString()); // 执行SQL语句 + } + + // 实现ContentProvider的getType方法,用于返回URI的MIME类型 + @Override + public String getType(Uri uri) { + // TODO: 根据URI返回相应的MIME类型,此处为自动生成的方法存根,需要实现具体逻辑 + return null; + } +} diff --git a/doc/notes/gtask/data/MetaData.java b/doc/notes/gtask/data/MetaData.java new file mode 100644 index 0000000..88da7bf --- /dev/null +++ b/doc/notes/gtask/data/MetaData.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + + +// MetaData类继承自Task类,用于处理元数据 +public class MetaData extends Task { + private final static String TAG = MetaData.class.getSimpleName(); // 日志标签,用于标识日志来源 + + private String mRelatedGid = null; // 相关的GTask ID + + // 设置元数据,将GTask ID和元信息放入JSONObject中,并设置笔记名称 + public void setMeta(String gid, JSONObject metaInfo) { + try { + metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); // 将GTask ID放入元信息中 + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); // 日志记录错误信息 + } + setNotes(metaInfo.toString()); // 将JSONObject转换为字符串并设置为笔记内容 + setName(GTaskStringUtils.META_NOTE_NAME); // 设置笔记名称 + } + + // 获取相关的GTask ID + public String getRelatedGid() { + return mRelatedGid; + } + + // 重写isWorthSaving方法,判断笔记内容是否不为空 + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + + // 重写setContentByRemoteJSON方法,从远程JSON中设置内容 + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); // 调用父类方法设置内容 + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); // 将笔记内容转换为JSONObject + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); // 获取GTask ID + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); // 日志记录警告信息 + mRelatedGid = null; // 如果出现异常,将GTask ID设置为null + } + } + } + + // 重写setContentByLocalJSON方法,抛出异常,因为该方法不应该被调用 + @Override + public void setContentByLocalJSON(JSONObject js) { + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + } + + // 重写getLocalJSONFromContent方法,抛出异常,因为该方法不应该被调用 + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + } + + // 重写getSyncAction方法,抛出异常,因为该方法不应该被调用 + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + } +} + diff --git a/doc/notes/gtask/data/Node.java b/doc/notes/gtask/data/Node.java new file mode 100644 index 0000000..67ef9e3 --- /dev/null +++ b/doc/notes/gtask/data/Node.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; + +// Node类是一个抽象类,用于表示同步操作的节点 +public abstract class Node { + // 同步操作常量,表示不需要执行任何同步操作 + public static final int SYNC_ACTION_NONE = 0; + // 同步操作常量,表示需要添加远程数据 + public static final int SYNC_ACTION_ADD_REMOTE = 1; + // 同步操作常量,表示需要添加本地数据 + public static final int SYNC_ACTION_ADD_LOCAL = 2; + // 同步操作常量,表示需要删除远程数据 + public static final int SYNC_ACTION_DEL_REMOTE = 3; + // 同步操作常量,表示需要删除本地数据 + public static final int SYNC_ACTION_DEL_LOCAL = 4; + // 同步操作常量,表示需要更新远程数据 + public static final int SYNC_ACTION_UPDATE_REMOTE = 5; + // 同步操作常量,表示需要更新本地数据 + public static final int SYNC_ACTION_UPDATE_LOCAL = 6; + // 同步操作常量,表示存在更新冲突 + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; + // 同步操作常量,表示同步操作出现错误 + public static final int SYNC_ACTION_ERROR = 8; + + private String mGid; // 节点的GTask ID + private String mName; // 节点的名称 + private long mLastModified; // 节点最后修改时间 + private boolean mDeleted; // 节点是否被删除的标志 + + // Node类的构造函数,初始化成员变量 + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + // 抽象方法,用于获取创建操作的JSON对象 + public abstract JSONObject getCreateAction(int actionId); + + // 抽象方法,用于获取更新操作的JSON对象 + public abstract JSONObject getUpdateAction(int actionId); + + // 抽象方法,用于根据远程JSON设置内容 + public abstract void setContentByRemoteJSON(JSONObject js); + + // 抽象方法,用于根据本地JSON设置内容 + public abstract void setContentByLocalJSON(JSONObject js); + + // 抽象方法,用于从内容获取本地JSON对象 + public abstract JSONObject getLocalJSONFromContent(); + + // 抽象方法,用于获取同步操作类型 + public abstract int getSyncAction(Cursor c); + + // 设置节点的GTask ID + public void setGid(String gid) { + this.mGid = gid; + } + + // 设置节点的名称 + public void setName(String name) { + this.mName = name; + } + + // 设置节点最后修改时间 + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + // 设置节点是否被删除的标志 + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + // 获取节点的GTask ID + public String getGid() { + return this.mGid; + } + + // 获取节点的名称 + public String getName() { + return this.mName; + } + + // 获取节点最后修改时间 + public long getLastModified() { + return this.mLastModified; + } + + // 获取节点是否被删除的标志 + public boolean getDeleted() { + return this.mDeleted; + } + +} + diff --git a/doc/notes/gtask/data/SqlData.java b/doc/notes/gtask/data/SqlData.java new file mode 100644 index 0000000..d3ec3be --- /dev/null +++ b/doc/notes/gtask/data/SqlData.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; +import net.micode.notes.gtask.exception.ActionFailureException; + +import org.json.JSONException; +import org.json.JSONObject; + + +public class SqlData { + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; + + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID; + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + + public void setContent(JSONObject js) throws JSONException { + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + + public long getId() { + return mDataId; + } +} diff --git a/doc/notes/gtask/data/SqlNote.java b/doc/notes/gtask/data/SqlNote.java new file mode 100644 index 0000000..79a4095 --- /dev/null +++ b/doc/notes/gtask/data/SqlNote.java @@ -0,0 +1,505 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.appwidget.AppWidgetManager; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; +import net.micode.notes.tool.ResourceParser; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class SqlNote { + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis(); + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis(); + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } + + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null); + if (c != null) { + c.moveToNext(); + loadFromCursor(c); + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + private void loadFromCursor(Cursor c) { + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) { + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } + + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + public long getId() { + return mId; + } + + public long getParentId() { + return mParentId; + } + + public String getSnippet() { + return mSnippet; + } + + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} diff --git a/doc/notes/gtask/data/Task.java b/doc/notes/gtask/data/Task.java new file mode 100644 index 0000000..6a19454 --- /dev/null +++ b/doc/notes/gtask/data/Task.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted; + + private String mNotes; + + private JSONObject mMetaInfo; + + private Task mPriorSibling; + + private TaskList mParent; + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null; + mParent = null; + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} diff --git a/doc/notes/gtask/data/TaskList.java b/doc/notes/gtask/data/TaskList.java new file mode 100644 index 0000000..4ea21c5 --- /dev/null +++ b/doc/notes/gtask/data/TaskList.java @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName(); + + private int mIndex; + + private ArrayList mChildren; + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public int getChildTaskCount() { + return mChildren.size(); + } + + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + } + } + return ret; + } + + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + } + + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) { + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} diff --git a/doc/notes/gtask/exception/ActionFailureException.java b/doc/notes/gtask/exception/ActionFailureException.java new file mode 100644 index 0000000..15504be --- /dev/null +++ b/doc/notes/gtask/exception/ActionFailureException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.exception; + +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; + + public ActionFailureException() { + super(); + } + + public ActionFailureException(String paramString) { + super(paramString); + } + + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/doc/notes/gtask/exception/NetworkFailureException.java b/doc/notes/gtask/exception/NetworkFailureException.java new file mode 100644 index 0000000..b08cfb1 --- /dev/null +++ b/doc/notes/gtask/exception/NetworkFailureException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.exception; + +public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; + + public NetworkFailureException() { + super(); + } + + public NetworkFailureException(String paramString) { + super(paramString); + } + + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/doc/notes/gtask/remote/GTaskASyncTask.java b/doc/notes/gtask/remote/GTaskASyncTask.java new file mode 100644 index 0000000..a1deb99 --- /dev/null +++ b/doc/notes/gtask/remote/GTaskASyncTask.java @@ -0,0 +1,124 @@ + +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; + +import net.micode.notes.R; +import net.micode.notes.ui.NotesListActivity; +import net.micode.notes.ui.NotesPreferenceActivity; + + +public class GTaskASyncTask extends AsyncTask { + + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + public interface OnCompleteListener { + void onComplete(); + } + + private Context mContext; + + private NotificationManager mNotifiManager; + + private GTaskManager mTaskManager; + + private OnCompleteListener mOnCompleteListener; + + public GTaskASyncTask(Context context, OnCompleteListener listener) { + mContext = context; + mOnCompleteListener = listener; + mNotifiManager = (NotificationManager) mContext + .getSystemService(Context.NOTIFICATION_SERVICE); + mTaskManager = GTaskManager.getInstance(); + } + + public void cancelSync() { + mTaskManager.cancelSync(); + } + + public void publishProgess(String message) { + publishProgress(new String[] { + message + }); + } + + private void showNotification(int tickerId, String content) { + PendingIntent pendingIntent; + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE); + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE); + } + Notification.Builder builder = new Notification.Builder(mContext) + .setAutoCancel(true) + .setContentTitle(mContext.getString(R.string.app_name)) + .setContentText(content) + .setContentIntent(pendingIntent) + .setWhen(System.currentTimeMillis()) + .setOngoing(true); + Notification notification=builder.getNotification(); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); + } + + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); + return mTaskManager.sync(mContext, this); + } + + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + @Override + protected void onPostExecute(Integer result) { + if (result == GTaskManager.STATE_SUCCESS) { + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } + if (mOnCompleteListener != null) { + new Thread(new Runnable() { + + public void run() { + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} diff --git a/doc/notes/gtask/remote/GTaskClient.java b/doc/notes/gtask/remote/GTaskClient.java new file mode 100644 index 0000000..c67dfdf --- /dev/null +++ b/doc/notes/gtask/remote/GTaskClient.java @@ -0,0 +1,585 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerFuture; +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.gtask.data.Node; +import net.micode.notes.gtask.data.Task; +import net.micode.notes.gtask.data.TaskList; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.gtask.exception.NetworkFailureException; +import net.micode.notes.tool.GTaskStringUtils; +import net.micode.notes.ui.NotesPreferenceActivity; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.cookie.Cookie; +import org.apache.http.impl.client.BasicCookieStore; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; +import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; +import java.util.zip.InflaterInputStream; + + +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + private static final String GTASK_URL = "https://mail.google.com/tasks/"; + + private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; + + private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; + + private static GTaskClient mInstance = null; + + private DefaultHttpClient mHttpClient; + + private String mGetUrl; + + private String mPostUrl; + + private long mClientVersion; + + private boolean mLoggedin; + + private long mLastLoginTime; + + private int mActionId; + + private Account mAccount; + + private JSONArray mUpdateArray; + + private GTaskClient() { + mHttpClient = null; + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + mClientVersion = -1; + mLoggedin = false; + mLastLoginTime = 0; + mActionId = 1; + mAccount = null; + mUpdateArray = null; + } + + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + public boolean login(Activity activity) { + // we suppose that the cookie would expire after 5 minutes + // then we need to re-login + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // need to re-login after account switch + if (mLoggedin + && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity + .getSyncAccountName(activity))) { + mLoggedin = false; + } + + if (mLoggedin) { + Log.d(TAG, "already logged in"); + return true; + } + + mLastLoginTime = System.currentTimeMillis(); + String authToken = loginGoogleAccount(activity, false); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + // login with custom domain if necessary + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() + .endsWith("googlemail.com"))) { + StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); + int index = mAccount.name.indexOf('@') + 1; + String suffix = mAccount.name.substring(index); + url.append(suffix + "/"); + mGetUrl = url.toString() + "ig"; + mPostUrl = url.toString() + "r/ig"; + + if (tryToLoginGtask(activity, authToken)) { + mLoggedin = true; + } + } + + // try to login with google official url + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + String authToken; + AccountManager accountManager = AccountManager.get(activity); + Account[] accounts = accountManager.getAccountsByType("com.google"); + + if (accounts.length == 0) { + Log.e(TAG, "there is no available google account"); + return null; + } + + String accountName = NotesPreferenceActivity.getSyncAccountName(activity); + Account account = null; + for (Account a : accounts) { + if (a.name.equals(accountName)) { + account = a; + break; + } + } + if (account != null) { + mAccount = account; + } else { + Log.e(TAG, "unable to get an account with the same name in the settings"); + return null; + } + + // get the token now + AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, + "goanna_mobile", null, activity, null, null); + try { + Bundle authTokenBundle = accountManagerFuture.getResult(); + authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + if (invalidateToken) { + accountManager.invalidateAuthToken("com.google", authToken); + loginGoogleAccount(activity, false); + } + } catch (Exception e) { + Log.e(TAG, "get auth token failed"); + authToken = null; + } + + return authToken; + } + + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // maybe the auth token is out of date, now let's invalidate the + // token and try again + authToken = loginGoogleAccount(activity, true); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + if (!loginGtask(authToken)) { + Log.e(TAG, "login gtask failed"); + return false; + } + } + return true; + } + + private boolean loginGtask(String authToken) { + int timeoutConnection = 10000; + int timeoutSocket = 15000; + HttpParams httpParameters = new BasicHttpParams(); + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); + mHttpClient = new DefaultHttpClient(httpParameters); + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); + mHttpClient.setCookieStore(localBasicCookieStore); + HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); + + // login gtask + try { + String loginUrl = mGetUrl + "?auth=" + authToken; + HttpGet httpGet = new HttpGet(loginUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the cookie now + List cookies = mHttpClient.getCookieStore().getCookies(); + boolean hasAuthCookie = false; + for (Cookie cookie : cookies) { + if (cookie.getName().contains("GTL")) { + hasAuthCookie = true; + } + } + if (!hasAuthCookie) { + Log.w(TAG, "it seems that there is no auth cookie"); + } + + // get the client version + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + mClientVersion = js.getLong("v"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } catch (Exception e) { + // simply catch all exceptions + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + private int getActionId() { + return mActionId++; + } + + private HttpPost createHttpPost() { + HttpPost httpPost = new HttpPost(mPostUrl); + httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + httpPost.setHeader("AT", "1"); + return httpPost; + } + + private String getResponseContent(HttpEntity entity) throws IOException { + String contentEncoding = null; + if (entity.getContentEncoding() != null) { + contentEncoding = entity.getContentEncoding().getValue(); + Log.d(TAG, "encoding: " + contentEncoding); + } + + InputStream input = entity.getContent(); + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { + input = new GZIPInputStream(entity.getContent()); + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { + Inflater inflater = new Inflater(true); + input = new InflaterInputStream(entity.getContent(), inflater); + } + + try { + InputStreamReader isr = new InputStreamReader(input); + BufferedReader br = new BufferedReader(isr); + StringBuilder sb = new StringBuilder(); + + while (true) { + String buff = br.readLine(); + if (buff == null) { + return sb.toString(); + } + sb = sb.append(buff); + } + } finally { + input.close(); + } + } + + private JSONObject postRequest(JSONObject js) throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + HttpPost httpPost = createHttpPost(); + try { + LinkedList list = new LinkedList(); + list.add(new BasicNameValuePair("r", js.toString())); + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); + httpPost.setEntity(entity); + + // execute the post + HttpResponse response = mHttpClient.execute(httpPost); + String jsString = getResponseContent(response.getEntity()); + return new JSONObject(jsString); + + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("unable to convert response content to jsonobject"); + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("error occurs when posting request"); + } + } + + public void createTask(Task task) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(task.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create task: handing jsonobject failed"); + } + } + + public void createTaskList(TaskList tasklist) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(tasklist.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create tasklist: handing jsonobject failed"); + } + } + + public void commitUpdate() throws NetworkFailureException { + if (mUpdateArray != null) { + try { + JSONObject jsPost = new JSONObject(); + + // action_list + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("commit update: handing jsonobject failed"); + } + } + } + + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // too many update items may result in an error + // set max to 10 items + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + public void moveTask(Task task, TaskList preParent, TaskList curParent) + throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); + if (preParent == curParent && task.getPriorSibling() != null) { + // put prioring_sibing_id only if moving within the tasklist and + // it is not the first one + action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); + } + action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); + action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); + if (preParent != curParent) { + // put the dest_list only if moving between tasklists + action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); + } + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("move task: handing jsonobject failed"); + } + } + + public void deleteNode(Node node) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + node.setDeleted(true); + actionList.put(node.getUpdateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("delete node: handing jsonobject failed"); + } + } + + public JSONArray getTaskLists() throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + try { + HttpGet httpGet = new HttpGet(mGetUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the task list + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task lists: handing jasonobject failed"); + } + } + + public JSONArray getTaskList(String listGid) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); + action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + JSONObject jsResponse = postRequest(jsPost); + return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task list: handing jsonobject failed"); + } + } + + public Account getSyncAccount() { + return mAccount; + } + + public void resetUpdateArray() { + mUpdateArray = null; + } +} diff --git a/doc/notes/gtask/remote/GTaskManager.java b/doc/notes/gtask/remote/GTaskManager.java new file mode 100644 index 0000000..d2b4082 --- /dev/null +++ b/doc/notes/gtask/remote/GTaskManager.java @@ -0,0 +1,800 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.data.MetaData; +import net.micode.notes.gtask.data.Node; +import net.micode.notes.gtask.data.SqlNote; +import net.micode.notes.gtask.data.Task; +import net.micode.notes.gtask.data.TaskList; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.gtask.exception.NetworkFailureException; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + + +public class GTaskManager { + private static final String TAG = GTaskManager.class.getSimpleName(); + + public static final int STATE_SUCCESS = 0; + + public static final int STATE_NETWORK_ERROR = 1; + + public static final int STATE_INTERNAL_ERROR = 2; + + public static final int STATE_SYNC_IN_PROGRESS = 3; + + public static final int STATE_SYNC_CANCELLED = 4; + + private static GTaskManager mInstance = null; + + private Activity mActivity; + + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mSyncing; + + private boolean mCancelled; + + private HashMap mGTaskListHashMap; + + private HashMap mGTaskHashMap; + + private HashMap mMetaHashMap; + + private TaskList mMetaList; + + private HashSet mLocalDeleteIdMap; + + private HashMap mGidToNid; + + private HashMap mNidToGid; + + private GTaskManager() { + mSyncing = false; + mCancelled = false; + mGTaskListHashMap = new HashMap(); + mGTaskHashMap = new HashMap(); + mMetaHashMap = new HashMap(); + mMetaList = null; + mLocalDeleteIdMap = new HashSet(); + mGidToNid = new HashMap(); + mNidToGid = new HashMap(); + } + + public static synchronized GTaskManager getInstance() { + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + public synchronized void setActivityContext(Activity activity) { + // used for getting authtoken + mActivity = activity; + } + + public int sync(Context context, GTaskASyncTask asyncTask) { + if (mSyncing) { + Log.d(TAG, "Sync is in progress"); + return STATE_SYNC_IN_PROGRESS; + } + mContext = context; + mContentResolver = mContext.getContentResolver(); + mSyncing = true; + mCancelled = false; + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + + try { + GTaskClient client = GTaskClient.getInstance(); + client.resetUpdateArray(); + + // login google task + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // get the task list from google + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); + + // do content sync work + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); + syncContent(); + } catch (NetworkFailureException e) { + Log.e(TAG, e.toString()); + return STATE_NETWORK_ERROR; + } catch (ActionFailureException e) { + Log.e(TAG, e.toString()); + return STATE_INTERNAL_ERROR; + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return STATE_INTERNAL_ERROR; + } finally { + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + mSyncing = false; + } + + return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; + } + + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); + try { + JSONArray jsTaskLists = client.getTaskLists(); + + // init meta list first + mMetaList = null; + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name + .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { + mMetaList = new TaskList(); + mMetaList.setContentByRemoteJSON(object); + + // load meta data + JSONArray jsMetas = client.getTaskList(gid); + for (int j = 0; j < jsMetas.length(); j++) { + object = (JSONObject) jsMetas.getJSONObject(j); + MetaData metaData = new MetaData(); + metaData.setContentByRemoteJSON(object); + if (metaData.isWorthSaving()) { + mMetaList.addChildTask(metaData); + if (metaData.getGid() != null) { + mMetaHashMap.put(metaData.getRelatedGid(), metaData); + } + } + } + } + } + + // create meta list if not existed + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // init task list + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) + && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META)) { + TaskList tasklist = new TaskList(); + tasklist.setContentByRemoteJSON(object); + mGTaskListHashMap.put(gid, tasklist); + mGTaskHashMap.put(gid, tasklist); + + // load tasks + JSONArray jsTasks = client.getTaskList(gid); + for (int j = 0; j < jsTasks.length(); j++) { + object = (JSONObject) jsTasks.getJSONObject(j); + gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + Task task = new Task(); + task.setContentByRemoteJSON(object); + if (task.isWorthSaving()) { + task.setMetaInfo(mMetaHashMap.get(gid)); + tasklist.addChildTask(task); + mGTaskHashMap.put(gid, task); + } + } + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("initGTaskList: handing JSONObject failed"); + } + } + + private void syncContent() throws NetworkFailureException { + int syncType; + Cursor c = null; + String gid; + Node node; + + mLocalDeleteIdMap.clear(); + + if (mCancelled) { + return; + } + + // for local deleted note + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id=?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, null); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); + } + + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + } + } else { + Log.w(TAG, "failed to query trash folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // sync folder first + syncFolder(); + + // for note existing in database + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing note in database"); + } + + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // go through remaining items + Iterator> iter = mGTaskHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + node = entry.getValue(); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + + // mCancelled can be set by another thread, so we neet to check one by + // one + // clear local delete table + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // refresh local sync id + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // for root folder + try { + c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); + if (c != null) { + c.moveToNext(); + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); + mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); + // for system folder, only update remote name if necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } else { + Log.w(TAG, "failed to query root folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for call-note folder + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + }, null); + if (c != null) { + if (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); + mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); + // for system folder, only update remote name if + // necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } + } else { + Log.w(TAG, "failed to query call note folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for local existing folders + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for remote add folders + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + gid = entry.getKey(); + node = entry.getValue(); + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + } + + if (!mCancelled) + GTaskClient.getInstance().commitUpdate(); + } + + private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + MetaData meta; + switch (syncType) { + case Node.SYNC_ACTION_ADD_LOCAL: + addLocalNode(node); + break; + case Node.SYNC_ACTION_ADD_REMOTE: + addRemoteNode(node, c); + break; + case Node.SYNC_ACTION_DEL_LOCAL: + meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + break; + case Node.SYNC_ACTION_DEL_REMOTE: + meta = mMetaHashMap.get(node.getGid()); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + GTaskClient.getInstance().deleteNode(node); + break; + case Node.SYNC_ACTION_UPDATE_LOCAL: + updateLocalNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_REMOTE: + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_CONFLICT: + // merging both modifications maybe a good idea + // right now just use local update simply + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unkown sync action type"); + } + } + + private void addLocalNode(Node node) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + if (node instanceof TaskList) { + if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); + } else if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); + } else { + sqlNote = new SqlNote(mContext); + sqlNote.setContent(node.getLocalJSONFromContent()); + sqlNote.setParentId(Notes.ID_ROOT_FOLDER); + } + } else { + sqlNote = new SqlNote(mContext); + JSONObject js = node.getLocalJSONFromContent(); + try { + if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.has(NoteColumns.ID)) { + long id = note.getLong(NoteColumns.ID); + if (DataUtils.existInNoteDatabase(mContentResolver, id)) { + // the id is not available, have to create a new one + note.remove(NoteColumns.ID); + } + } + } + + if (js.has(GTaskStringUtils.META_HEAD_DATA)) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { + // the data id is not available, have to create + // a new one + data.remove(DataColumns.ID); + } + } + } + + } + } catch (JSONException e) { + Log.w(TAG, e.toString()); + e.printStackTrace(); + } + sqlNote.setContent(js); + + Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot add local node"); + } + sqlNote.setParentId(parentId.longValue()); + } + + // create the local node + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // update gid-nid mapping + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + } + + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // update the note locally + sqlNote = new SqlNote(mContext, c); + sqlNote.setContent(node.getLocalJSONFromContent()); + + Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) + : new Long(Notes.ID_ROOT_FOLDER); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot update local node"); + } + sqlNote.setParentId(parentId.longValue()); + sqlNote.commit(true); + + // update meta info + updateRemoteMeta(node.getGid(), sqlNote); + } + + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + Node n; + + // update remotely + if (sqlNote.isNoteType()) { + Task task = new Task(); + task.setContentByLocalJSON(sqlNote.getContent()); + + String parentGid = mNidToGid.get(sqlNote.getParentId()); + if (parentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot add remote task"); + } + mGTaskListHashMap.get(parentGid).addChildTask(task); + + GTaskClient.getInstance().createTask(task); + n = (Node) task; + + // add meta + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // we need to skip folder if it has already existed + String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; + if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) + folderName += GTaskStringUtils.FOLDER_DEFAULT; + else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) + folderName += GTaskStringUtils.FOLDER_CALL_NOTE; + else + folderName += sqlNote.getSnippet(); + + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String gid = entry.getKey(); + TaskList list = entry.getValue(); + + if (list.getName().equals(folderName)) { + tasklist = list; + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + } + break; + } + } + + // no match we can add now + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // update local note + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id mapping + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + + if (preParentList != curParentList) { + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + sqlNote.commit(true); + } + + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + public void cancelSync() { + mCancelled = true; + } +} diff --git a/doc/notes/gtask/remote/GTaskSyncService.java b/doc/notes/gtask/remote/GTaskSyncService.java new file mode 100644 index 0000000..cca36f7 --- /dev/null +++ b/doc/notes/gtask/remote/GTaskSyncService.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Activity; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; + +public class GTaskSyncService extends Service { + public final static String ACTION_STRING_NAME = "sync_action_type"; + + public final static int ACTION_START_SYNC = 0; + + public final static int ACTION_CANCEL_SYNC = 1; + + public final static int ACTION_INVALID = 2; + + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; + + private static GTaskASyncTask mSyncTask = null; + + private static String mSyncProgress = ""; + + private void startSync() { + if (mSyncTask == null) { + mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { + public void onComplete() { + mSyncTask = null; + sendBroadcast(""); + stopSelf(); + } + }); + sendBroadcast(""); + mSyncTask.execute(); + } + } + + private void cancelSync() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + @Override + public void onCreate() { + mSyncTask = null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Bundle bundle = intent.getExtras(); + if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { + switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { + case ACTION_START_SYNC: + startSync(); + break; + case ACTION_CANCEL_SYNC: + cancelSync(); + break; + default: + break; + } + return START_STICKY; + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onLowMemory() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + public IBinder onBind(Intent intent) { + return null; + } + + public void sendBroadcast(String msg) { + mSyncProgress = msg; + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); + intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); + sendBroadcast(intent); + } + + public static void startSync(Activity activity) { + GTaskManager.getInstance().setActivityContext(activity); + Intent intent = new Intent(activity, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); + activity.startService(intent); + } + + public static void cancelSync(Context context) { + Intent intent = new Intent(context, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); + context.startService(intent); + } + + public static boolean isSyncing() { + return mSyncTask != null; + } + + public static String getProgressString() { + return mSyncProgress; + } +} diff --git a/doc/notes/model/Note.java b/doc/notes/model/Note.java new file mode 100644 index 0000000..6706cf6 --- /dev/null +++ b/doc/notes/model/Note.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.model; +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.net.Uri; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; + +import java.util.ArrayList; + + +public class Note { + private ContentValues mNoteDiffValues; + private NoteData mNoteData; + private static final String TAG = "Note"; + /** + * Create a new note id for adding a new note to databases + */ + public static synchronized long getNewNoteId(Context context, long folderId) { + // Create a new note in the database + ContentValues values = new ContentValues(); + long createdTime = System.currentTimeMillis(); + values.put(NoteColumns.CREATED_DATE, createdTime); + values.put(NoteColumns.MODIFIED_DATE, createdTime); + values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + values.put(NoteColumns.PARENT_ID, folderId); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + + long noteId = 0; + try { + noteId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + noteId = 0; + } + if (noteId == -1) { + throw new IllegalStateException("Wrong note id:" + noteId); + } + return noteId; + } + + public Note() { + mNoteDiffValues = new ContentValues(); + mNoteData = new NoteData(); + } + + public void setNoteValue(String key, String value) { + mNoteDiffValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + public void setTextData(String key, String value) { + mNoteData.setTextData(key, value); + } + + public void setTextDataId(long id) { + mNoteData.setTextDataId(id); + } + + public long getTextDataId() { + return mNoteData.mTextDataId; + } + + public void setCallDataId(long id) { + mNoteData.setCallDataId(id); + } + + public void setCallData(String key, String value) { + mNoteData.setCallData(key, value); + } + + public boolean isLocalModified() { + return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); + } + + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + if (!isLocalModified()) { + return true; + } + + /** + * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and + * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the + * note data info + */ + if (context.getContentResolver().update( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, + null) == 0) { + Log.e(TAG, "Update note error, should not happen"); + // Do not return, fall through + } + mNoteDiffValues.clear(); + + if (mNoteData.isLocalModified() + && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + return false; + } + + return true; + } + + private class NoteData { + private long mTextDataId; + + private ContentValues mTextDataValues; + + private long mCallDataId; + + private ContentValues mCallDataValues; + + private static final String TAG = "NoteData"; + + public NoteData() { + mTextDataValues = new ContentValues(); + mCallDataValues = new ContentValues(); + mTextDataId = 0; + mCallDataId = 0; + } + + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("Text data id should larger than 0"); + } + mTextDataId = id; + } + + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("Call data id should larger than 0"); + } + mCallDataId = id; + } + + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * Check for safety + */ + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + ArrayList operationList = new ArrayList(); + ContentProviderOperation.Builder builder = null; + + if(mTextDataValues.size() > 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId); + if (mTextDataId == 0) { + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new text data fail with noteId" + noteId); + mTextDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); + } + + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); + if (mCallDataId == 0) { + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new call data fail with noteId" + noteId); + mCallDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); + } + + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } + } + return null; + } + } +} diff --git a/doc/notes/model/WorkingNote.java b/doc/notes/model/WorkingNote.java new file mode 100644 index 0000000..be081e4 --- /dev/null +++ b/doc/notes/model/WorkingNote.java @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.model; + +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.tool.ResourceParser.NoteBgResources; + + +public class WorkingNote { + // Note for the working note + private Note mNote; + // Note Id + private long mNoteId; + // Note content + private String mContent; + // Note mode + private int mMode; + + private long mAlertDate; + + private long mModifiedDate; + + private int mBgColorId; + + private int mWidgetId; + + private int mWidgetType; + + private long mFolderId; + + private Context mContext; + + private static final String TAG = "WorkingNote"; + + private boolean mIsDeleted; + + private NoteSettingChangedListener mNoteSettingStatusListener; + + public static final String[] DATA_PROJECTION = new String[] { + DataColumns.ID, + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + public static final String[] NOTE_PROJECTION = new String[] { + NoteColumns.PARENT_ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + NoteColumns.MODIFIED_DATE + }; + + private static final int DATA_ID_COLUMN = 0; + + private static final int DATA_CONTENT_COLUMN = 1; + + private static final int DATA_MIME_TYPE_COLUMN = 2; + + private static final int DATA_MODE_COLUMN = 3; + + private static final int NOTE_PARENT_ID_COLUMN = 0; + + private static final int NOTE_ALERTED_DATE_COLUMN = 1; + + private static final int NOTE_BG_COLOR_ID_COLUMN = 2; + + private static final int NOTE_WIDGET_ID_COLUMN = 3; + + private static final int NOTE_WIDGET_TYPE_COLUMN = 4; + + private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + + // New note construct + private WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; + mModifiedDate = System.currentTimeMillis(); + mFolderId = folderId; + mNote = new Note(); + mNoteId = 0; + mIsDeleted = false; + mMode = 0; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + } + + // Existing note construct + private WorkingNote(Context context, long noteId, long folderId) { + mContext = context; + mNoteId = noteId; + mFolderId = folderId; + mIsDeleted = false; + mNote = new Note(); + loadNote(); + } + + private void loadNote() { + Cursor cursor = mContext.getContentResolver().query( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, + null, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); + mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); + mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); + mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); + mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + } + cursor.close(); + } else { + Log.e(TAG, "No note with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note with id " + mNoteId); + } + loadNoteData(); + } + + private void loadNoteData() { + Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, + DataColumns.NOTE_ID + "=?", new String[] { + String.valueOf(mNoteId) + }, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + if (DataConstants.NOTE.equals(type)) { + mContent = cursor.getString(DATA_CONTENT_COLUMN); + mMode = cursor.getInt(DATA_MODE_COLUMN); + mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); + } else if (DataConstants.CALL_NOTE.equals(type)) { + mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); + } else { + Log.d(TAG, "Wrong note type with type:" + type); + } + } while (cursor.moveToNext()); + } + cursor.close(); + } else { + Log.e(TAG, "No data with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); + } + } + + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + note.setBgColorId(defaultBgColorId); + note.setWidgetId(widgetId); + note.setWidgetType(widgetType); + return note; + } + + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + public synchronized boolean saveNote() { + if (isWorthSaving()) { + if (!existInDatabase()) { + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + mNote.syncNote(mContext, mNoteId); + + /** + * Update widget content if there exist any widget of this note + */ + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE + && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + public boolean existInDatabase() { + return mNoteId > 0; + } + + private boolean isWorthSaving() { + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; + } else { + return true; + } + } + + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + public void markDeleted(boolean mark) { + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + } + + public void setBgColorId(int id) { + if (id != mBgColorId) { + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + public void setCheckListMode(int mode) { + if (mMode != mode) { + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + public void setWidgetType(int type) { + if (type != mWidgetType) { + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + } + } + + public void setWidgetId(int id) { + if (id != mWidgetId) { + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + } + } + + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) { + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + public String getContent() { + return mContent; + } + + public long getAlertDate() { + return mAlertDate; + } + + public long getModifiedDate() { + return mModifiedDate; + } + + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + public int getBgColorId() { + return mBgColorId; + } + + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + public int getCheckListMode() { + return mMode; + } + + public long getNoteId() { + return mNoteId; + } + + public long getFolderId() { + return mFolderId; + } + + public int getWidgetId() { + return mWidgetId; + } + + public int getWidgetType() { + return mWidgetType; + } + + public interface NoteSettingChangedListener { + /** + * Called when the background color of current note has just changed + */ + void onBackgroundColorChanged(); + + /** + * Called when user set clock + */ + void onClockAlertChanged(long date, boolean set); + + /** + * Call when user create note from widget + */ + void onWidgetChanged(); + + /** + * Call when switch between check list mode and normal mode + * @param oldMode is previous mode before change + * @param newMode is new mode + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} diff --git a/doc/notes/tool/BackupUtils.java b/doc/notes/tool/BackupUtils.java new file mode 100644 index 0000000..39f6ec4 --- /dev/null +++ b/doc/notes/tool/BackupUtils.java @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.database.Cursor; +import android.os.Environment; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; + + +public class BackupUtils { + private static final String TAG = "BackupUtils"; + // Singleton stuff + private static BackupUtils sInstance; + + public static synchronized BackupUtils getInstance(Context context) { + if (sInstance == null) { + sInstance = new BackupUtils(context); + } + return sInstance; + } + + /** + * Following states are signs to represents backup or restore + * status + */ + // Currently, the sdcard is not mounted + public static final int STATE_SD_CARD_UNMOUONTED = 0; + // The backup file not exist + public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; + // The data is not well formated, may be changed by other programs + public static final int STATE_DATA_DESTROIED = 2; + // Some run-time exception which causes restore or backup fails + public static final int STATE_SYSTEM_ERROR = 3; + // Backup or restore success + public static final int STATE_SUCCESS = 4; + + private TextExport mTextExport; + + private BackupUtils(Context context) { + mTextExport = new TextExport(context); + } + + private static boolean externalStorageAvailable() { + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + public int exportToText() { + return mTextExport.exportToText(); + } + + public String getExportedTextFileName() { + return mTextExport.mFileName; + } + + public String getExportedTextFileDir() { + return mTextExport.mFileDirectory; + } + + private static class TextExport { + private static final String[] NOTE_PROJECTION = { + NoteColumns.ID, + NoteColumns.MODIFIED_DATE, + NoteColumns.SNIPPET, + NoteColumns.TYPE + }; + + private static final int NOTE_COLUMN_ID = 0; + + private static final int NOTE_COLUMN_MODIFIED_DATE = 1; + + private static final int NOTE_COLUMN_SNIPPET = 2; + + private static final String[] DATA_PROJECTION = { + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + private static final int DATA_COLUMN_CONTENT = 0; + + private static final int DATA_COLUMN_MIME_TYPE = 1; + + private static final int DATA_COLUMN_CALL_DATE = 2; + + private static final int DATA_COLUMN_PHONE_NUMBER = 4; + + private final String [] TEXT_FORMAT; + private static final int FORMAT_FOLDER_NAME = 0; + private static final int FORMAT_NOTE_DATE = 1; + private static final int FORMAT_NOTE_CONTENT = 2; + + private Context mContext; + private String mFileName; + private String mFileDirectory; + + public TextExport(Context context) { + TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + mContext = context; + mFileName = ""; + mFileDirectory = ""; + } + + private String getFormat(int id) { + return TEXT_FORMAT[id]; + } + + /** + * Export the folder identified by folder id to text + */ + private void exportFolderToText(String folderId, PrintStream ps) { + // Query notes belong to this folder + Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { + folderId + }, null); + + if (notesCursor != null) { + if (notesCursor.moveToFirst()) { + do { + // Print note's last modified date + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = notesCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (notesCursor.moveToNext()); + } + notesCursor.close(); + } + } + + /** + * Export note identified by id to a print stream + */ + private void exportNoteToText(String noteId, PrintStream ps) { + Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, + DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { + noteId + }, null); + + if (dataCursor != null) { + if (dataCursor.moveToFirst()) { + do { + String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); + if (DataConstants.CALL_NOTE.equals(mimeType)) { + // Print phone number + String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); + long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); + String location = dataCursor.getString(DATA_COLUMN_CONTENT); + + if (!TextUtils.isEmpty(phoneNumber)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + phoneNumber)); + } + // Print call date + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat + .format(mContext.getString(R.string.format_datetime_mdhm), + callDate))); + // Print call attachment location + if (!TextUtils.isEmpty(location)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + location)); + } + } else if (DataConstants.NOTE.equals(mimeType)) { + String content = dataCursor.getString(DATA_COLUMN_CONTENT); + if (!TextUtils.isEmpty(content)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + content)); + } + } + } while (dataCursor.moveToNext()); + } + dataCursor.close(); + } + // print a line separator between note + try { + ps.write(new byte[] { + Character.LINE_SEPARATOR, Character.LETTER_NUMBER + }); + } catch (IOException e) { + Log.e(TAG, e.toString()); + } + } + + /** + * Note will be exported as text which is user readable + */ + public int exportToText() { + if (!externalStorageAvailable()) { + Log.d(TAG, "Media was not mounted"); + return STATE_SD_CARD_UNMOUONTED; + } + + PrintStream ps = getExportToTextPrintStream(); + if (ps == null) { + Log.e(TAG, "get print stream error"); + return STATE_SYSTEM_ERROR; + } + // First export folder and its notes + Cursor folderCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); + + if (folderCursor != null) { + if (folderCursor.moveToFirst()) { + do { + // Print folder's name + String folderName = ""; + if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { + folderName = mContext.getString(R.string.call_record_folder_name); + } else { + folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); + } + if (!TextUtils.isEmpty(folderName)) { + ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); + } + String folderId = folderCursor.getString(NOTE_COLUMN_ID); + exportFolderToText(folderId, ps); + } while (folderCursor.moveToNext()); + } + folderCursor.close(); + } + + // Export notes in root's folder + Cursor noteCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID + + "=0", null, null); + + if (noteCursor != null) { + if (noteCursor.moveToFirst()) { + do { + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = noteCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (noteCursor.moveToNext()); + } + noteCursor.close(); + } + ps.close(); + + return STATE_SUCCESS; + } + + /** + * Get a print stream pointed to the file {@generateExportedTextFile} + */ + private PrintStream getExportToTextPrintStream() { + File file = generateFileMountedOnSDcard(mContext, R.string.file_path, + R.string.file_name_txt_format); + if (file == null) { + Log.e(TAG, "create file to exported failed"); + return null; + } + mFileName = file.getName(); + mFileDirectory = mContext.getString(R.string.file_path); + PrintStream ps = null; + try { + FileOutputStream fos = new FileOutputStream(file); + ps = new PrintStream(fos); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } catch (NullPointerException e) { + e.printStackTrace(); + return null; + } + return ps; + } + } + + /** + * Generate the text file to store imported data + */ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); + sb.append(context.getString(filePathResId)); + File filedir = new File(sb.toString()); + sb.append(context.getString( + fileNameFormatResId, + DateFormat.format(context.getString(R.string.format_date_ymd), + System.currentTimeMillis()))); + File file = new File(sb.toString()); + + try { + if (!filedir.exists()) { + filedir.mkdir(); + } + if (!file.exists()) { + file.createNewFile(); + } + return file; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } +} + + diff --git a/doc/notes/tool/DataUtils.java b/doc/notes/tool/DataUtils.java new file mode 100644 index 0000000..2a14982 --- /dev/null +++ b/doc/notes/tool/DataUtils.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.OperationApplicationException; +import android.database.Cursor; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; + +import java.util.ArrayList; +import java.util.HashSet; + + +public class DataUtils { + public static final String TAG = "DataUtils"; + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + if (ids.size() == 0) { + Log.d(TAG, "no id is in the hashset"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + if(id == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Don't delete system folder root"); + continue; + } + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + operationList.add(builder.build()); + } + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); + } + + public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, + long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + builder.withValue(NoteColumns.PARENT_ID, folderId); + builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); + operationList.add(builder.build()); + } + + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + /** + * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + */ + public static int getUserFolderCount(ContentResolver resolver) { + Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { "COUNT(*)" }, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, + null); + + int count = 0; + if(cursor != null) { + if(cursor.moveToFirst()) { + try { + count = cursor.getInt(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "get folder count failed:" + e.toString()); + } finally { + cursor.close(); + } + } + } + return count; + } + + public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, + new String [] {String.valueOf(type)}, + null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", + new String[] { name }, null); + boolean exist = false; + if(cursor != null) { + if(cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + NoteColumns.PARENT_ID + "=?", + new String[] { String.valueOf(folderId) }, + null); + + HashSet set = null; + if (c != null) { + if (c.moveToFirst()) { + set = new HashSet(); + do { + try { + AppWidgetAttribute widget = new AppWidgetAttribute(); + widget.widgetId = c.getInt(0); + widget.widgetType = c.getInt(1); + set.add(widget); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, e.toString()); + } + } while (c.moveToNext()); + } + c.close(); + } + return set; + } + + public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", + new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + null); + + if (cursor != null && cursor.moveToFirst()) { + try { + return cursor.getString(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call number fails " + e.toString()); + } finally { + cursor.close(); + } + } + return ""; + } + + public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.NOTE_ID }, + CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" + + CallNote.PHONE_NUMBER + ",?)", + new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, + null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + try { + return cursor.getLong(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call note id fails " + e.toString()); + } + } + cursor.close(); + } + return 0; + } + + public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + NoteColumns.ID + "=?", + new String [] { String.valueOf(noteId)}, + null); + + if (cursor != null) { + String snippet = ""; + if (cursor.moveToFirst()) { + snippet = cursor.getString(0); + } + cursor.close(); + return snippet; + } + throw new IllegalArgumentException("Note is not found with id: " + noteId); + } + + public static String getFormattedSnippet(String snippet) { + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); + } + } + return snippet; + } +} diff --git a/doc/notes/tool/GTaskStringUtils.java b/doc/notes/tool/GTaskStringUtils.java new file mode 100644 index 0000000..666b729 --- /dev/null +++ b/doc/notes/tool/GTaskStringUtils.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +public class GTaskStringUtils { + + public final static String GTASK_JSON_ACTION_ID = "action_id"; + + public final static String GTASK_JSON_ACTION_LIST = "action_list"; + + public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + + public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; + + public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; + + public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; + + public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; + + public final static String GTASK_JSON_CREATOR_ID = "creator_id"; + + public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; + + public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; + + public final static String GTASK_JSON_COMPLETED = "completed"; + + public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; + + public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; + + public final static String GTASK_JSON_DELETED = "deleted"; + + public final static String GTASK_JSON_DEST_LIST = "dest_list"; + + public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; + + public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; + + public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; + + public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; + + public final static String GTASK_JSON_GET_DELETED = "get_deleted"; + + public final static String GTASK_JSON_ID = "id"; + + public final static String GTASK_JSON_INDEX = "index"; + + public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; + + public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; + + public final static String GTASK_JSON_LIST_ID = "list_id"; + + public final static String GTASK_JSON_LISTS = "lists"; + + public final static String GTASK_JSON_NAME = "name"; + + public final static String GTASK_JSON_NEW_ID = "new_id"; + + public final static String GTASK_JSON_NOTES = "notes"; + + public final static String GTASK_JSON_PARENT_ID = "parent_id"; + + public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; + + public final static String GTASK_JSON_RESULTS = "results"; + + public final static String GTASK_JSON_SOURCE_LIST = "source_list"; + + public final static String GTASK_JSON_TASKS = "tasks"; + + public final static String GTASK_JSON_TYPE = "type"; + + public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; + + public final static String GTASK_JSON_TYPE_TASK = "TASK"; + + public final static String GTASK_JSON_USER = "user"; + + public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + + public final static String FOLDER_DEFAULT = "Default"; + + public final static String FOLDER_CALL_NOTE = "Call_Note"; + + public final static String FOLDER_META = "METADATA"; + + public final static String META_HEAD_GTASK_ID = "meta_gid"; + + public final static String META_HEAD_NOTE = "meta_note"; + + public final static String META_HEAD_DATA = "meta_data"; + + public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; + +} diff --git a/doc/notes/tool/ResourceParser.java b/doc/notes/tool/ResourceParser.java new file mode 100644 index 0000000..1ad3ad6 --- /dev/null +++ b/doc/notes/tool/ResourceParser.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.preference.PreferenceManager; + +import net.micode.notes.R; +import net.micode.notes.ui.NotesPreferenceActivity; + +public class ResourceParser { + + public static final int YELLOW = 0; + public static final int BLUE = 1; + public static final int WHITE = 2; + public static final int GREEN = 3; + public static final int RED = 4; + + public static final int BG_DEFAULT_COLOR = YELLOW; + + public static final int TEXT_SMALL = 0; + public static final int TEXT_MEDIUM = 1; + public static final int TEXT_LARGE = 2; + public static final int TEXT_SUPER = 3; + + public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + + public static class NoteBgResources { + private final static int [] BG_EDIT_RESOURCES = new int [] { + R.drawable.edit_yellow, + R.drawable.edit_blue, + R.drawable.edit_white, + R.drawable.edit_green, + R.drawable.edit_red + }; + + private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { + R.drawable.edit_title_yellow, + R.drawable.edit_title_blue, + R.drawable.edit_title_white, + R.drawable.edit_title_green, + R.drawable.edit_title_red + }; + + public static int getNoteBgResource(int id) { + return BG_EDIT_RESOURCES[id]; + } + + public static int getNoteTitleBgResource(int id) { + return BG_EDIT_TITLE_RESOURCES[id]; + } + } + + public static int getDefaultBgId(Context context) { + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( + NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); + } else { + return BG_DEFAULT_COLOR; + } + } + + public static class NoteItemBgResources { + private final static int [] BG_FIRST_RESOURCES = new int [] { + R.drawable.list_yellow_up, + R.drawable.list_blue_up, + R.drawable.list_white_up, + R.drawable.list_green_up, + R.drawable.list_red_up + }; + + private final static int [] BG_NORMAL_RESOURCES = new int [] { + R.drawable.list_yellow_middle, + R.drawable.list_blue_middle, + R.drawable.list_white_middle, + R.drawable.list_green_middle, + R.drawable.list_red_middle + }; + + private final static int [] BG_LAST_RESOURCES = new int [] { + R.drawable.list_yellow_down, + R.drawable.list_blue_down, + R.drawable.list_white_down, + R.drawable.list_green_down, + R.drawable.list_red_down, + }; + + private final static int [] BG_SINGLE_RESOURCES = new int [] { + R.drawable.list_yellow_single, + R.drawable.list_blue_single, + R.drawable.list_white_single, + R.drawable.list_green_single, + R.drawable.list_red_single + }; + + public static int getNoteBgFirstRes(int id) { + return BG_FIRST_RESOURCES[id]; + } + + public static int getNoteBgLastRes(int id) { + return BG_LAST_RESOURCES[id]; + } + + public static int getNoteBgSingleRes(int id) { + return BG_SINGLE_RESOURCES[id]; + } + + public static int getNoteBgNormalRes(int id) { + return BG_NORMAL_RESOURCES[id]; + } + + public static int getFolderBgRes() { + return R.drawable.list_folder; + } + } + + public static class WidgetBgResources { + private final static int [] BG_2X_RESOURCES = new int [] { + R.drawable.widget_2x_yellow, + R.drawable.widget_2x_blue, + R.drawable.widget_2x_white, + R.drawable.widget_2x_green, + R.drawable.widget_2x_red, + }; + + public static int getWidget2xBgResource(int id) { + return BG_2X_RESOURCES[id]; + } + + private final static int [] BG_4X_RESOURCES = new int [] { + R.drawable.widget_4x_yellow, + R.drawable.widget_4x_blue, + R.drawable.widget_4x_white, + R.drawable.widget_4x_green, + R.drawable.widget_4x_red + }; + + public static int getWidget4xBgResource(int id) { + return BG_4X_RESOURCES[id]; + } + } + + public static class TextAppearanceResources { + private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper + }; + + public static int getTexAppearanceResource(int id) { + /** + * HACKME: Fix bug of store the resource id in shared preference. + * The id may larger than the length of resources, in this case, + * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + */ + if (id >= TEXTAPPEARANCE_RESOURCES.length) { + return BG_DEFAULT_FONT_SIZE; + } + return TEXTAPPEARANCE_RESOURCES[id]; + } + + public static int getResourcesSize() { + return TEXTAPPEARANCE_RESOURCES.length; + } + } +} diff --git a/doc/notes/ui/AlarmAlertActivity.java b/doc/notes/ui/AlarmAlertActivity.java new file mode 100644 index 0000000..85723be --- /dev/null +++ b/doc/notes/ui/AlarmAlertActivity.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.PowerManager; +import android.provider.Settings; +import android.view.Window; +import android.view.WindowManager; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.DataUtils; + +import java.io.IOException; + + +public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { + private long mNoteId; + private String mSnippet; + private static final int SNIPPET_PREW_MAX_LEN = 60; + MediaPlayer mPlayer; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + final Window win = getWindow(); + win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + + if (!isScreenOn()) { + win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); + } + + Intent intent = getIntent(); + + try { + mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); + mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, + SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) + : mSnippet; + } catch (IllegalArgumentException e) { + e.printStackTrace(); + return; + } + + mPlayer = new MediaPlayer(); + if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { + showActionDialog(); + playAlarmSound(); + } else { + finish(); + } + } + + private boolean isScreenOn() { + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + return pm.isScreenOn(); + } + + private void playAlarmSound() { + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + + int silentModeStreams = Settings.System.getInt(getContentResolver(), + Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); + + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { + mPlayer.setAudioStreamType(silentModeStreams); + } else { + mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); + } + try { + mPlayer.setDataSource(this, url); + mPlayer.prepare(); + mPlayer.setLooping(true); + mPlayer.start(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalStateException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void showActionDialog() { + AlertDialog.Builder dialog = new AlertDialog.Builder(this); + dialog.setTitle(R.string.app_name); + dialog.setMessage(mSnippet); + dialog.setPositiveButton(R.string.notealert_ok, this); + if (isScreenOn()) { + dialog.setNegativeButton(R.string.notealert_enter, this); + } + dialog.show().setOnDismissListener(this); + } + + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_NEGATIVE: + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, mNoteId); + startActivity(intent); + break; + default: + break; + } + } + + public void onDismiss(DialogInterface dialog) { + stopAlarmSound(); + finish(); + } + + private void stopAlarmSound() { + if (mPlayer != null) { + mPlayer.stop(); + mPlayer.release(); + mPlayer = null; + } + } +} diff --git a/doc/notes/ui/AlarmInitReceiver.java b/doc/notes/ui/AlarmInitReceiver.java new file mode 100644 index 0000000..f221202 --- /dev/null +++ b/doc/notes/ui/AlarmInitReceiver.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; + + +public class AlarmInitReceiver extends BroadcastReceiver { + + private static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.ALERTED_DATE + }; + + private static final int COLUMN_ID = 0; + private static final int COLUMN_ALERTED_DATE = 1; + + @Override + public void onReceive(Context context, Intent intent) { + long currentDate = System.currentTimeMillis(); + Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, + new String[] { String.valueOf(currentDate) }, + null); + + if (c != null) { + if (c.moveToFirst()) { + do { + long alertDate = c.getLong(COLUMN_ALERTED_DATE); + Intent sender = new Intent(context, AlarmReceiver.class); + sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); + AlarmManager alermManager = (AlarmManager) context + .getSystemService(Context.ALARM_SERVICE); + alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + } while (c.moveToNext()); + } + c.close(); + } + } +} diff --git a/doc/notes/ui/AlarmReceiver.java b/doc/notes/ui/AlarmReceiver.java new file mode 100644 index 0000000..54e503b --- /dev/null +++ b/doc/notes/ui/AlarmReceiver.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class AlarmReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + intent.setClass(context, AlarmAlertActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } +} diff --git a/doc/notes/ui/DateTimePicker.java b/doc/notes/ui/DateTimePicker.java new file mode 100644 index 0000000..496b0cd --- /dev/null +++ b/doc/notes/ui/DateTimePicker.java @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import java.text.DateFormatSymbols; +import java.util.Calendar; + +import net.micode.notes.R; + + +import android.content.Context; +import android.text.format.DateFormat; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.NumberPicker; + +public class DateTimePicker extends FrameLayout { + + private static final boolean DEFAULT_ENABLE_STATE = true; + + private static final int HOURS_IN_HALF_DAY = 12; + private static final int HOURS_IN_ALL_DAY = 24; + private static final int DAYS_IN_ALL_WEEK = 7; + private static final int DATE_SPINNER_MIN_VAL = 0; + private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; + private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; + private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; + private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; + private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; + private static final int MINUT_SPINNER_MIN_VAL = 0; + private static final int MINUT_SPINNER_MAX_VAL = 59; + private static final int AMPM_SPINNER_MIN_VAL = 0; + private static final int AMPM_SPINNER_MAX_VAL = 1; + + private final NumberPicker mDateSpinner; + private final NumberPicker mHourSpinner; + private final NumberPicker mMinuteSpinner; + private final NumberPicker mAmPmSpinner; + private Calendar mDate; + + private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; + + private boolean mIsAm; + + private boolean mIs24HourView; + + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; + + private boolean mInitialising; + + private OnDateTimeChangedListener mOnDateTimeChangedListener; + + private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); + updateDateControl(); + onDateTimeChanged(); + } + }; + + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + boolean isDateChanged = false; + Calendar cal = Calendar.getInstance(); + if (!mIs24HourView) { + if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || + oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + mIsAm = !mIsAm; + updateAmPmControl(); + } + } else { + if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + } + int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + mDate.set(Calendar.HOUR_OF_DAY, newHour); + onDateTimeChanged(); + if (isDateChanged) { + setCurrentYear(cal.get(Calendar.YEAR)); + setCurrentMonth(cal.get(Calendar.MONTH)); + setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); + } + } + }; + + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + int minValue = mMinuteSpinner.getMinValue(); + int maxValue = mMinuteSpinner.getMaxValue(); + int offset = 0; + if (oldVal == maxValue && newVal == minValue) { + offset += 1; + } else if (oldVal == minValue && newVal == maxValue) { + offset -= 1; + } + if (offset != 0) { + mDate.add(Calendar.HOUR_OF_DAY, offset); + mHourSpinner.setValue(getCurrentHour()); + updateDateControl(); + int newHour = getCurrentHourOfDay(); + if (newHour >= HOURS_IN_HALF_DAY) { + mIsAm = false; + updateAmPmControl(); + } else { + mIsAm = true; + updateAmPmControl(); + } + } + mDate.set(Calendar.MINUTE, newVal); + onDateTimeChanged(); + } + }; + + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mIsAm = !mIsAm; + if (mIsAm) { + mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); + } else { + mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); + } + updateAmPmControl(); + onDateTimeChanged(); + } + }; + + public interface OnDateTimeChangedListener { + void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute); + } + + public DateTimePicker(Context context) { + this(context, System.currentTimeMillis()); + } + + public DateTimePicker(Context context, long date) { + this(context, date, DateFormat.is24HourFormat(context)); + } + + public DateTimePicker(Context context, long date, boolean is24HourView) { + super(context); + mDate = Calendar.getInstance(); + mInitialising = true; + mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; + inflate(context, R.layout.datetime_picker, this); + + mDateSpinner = (NumberPicker) findViewById(R.id.date); + mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); + mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); + mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); + + mHourSpinner = (NumberPicker) findViewById(R.id.hour); + mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); + mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); + mMinuteSpinner.setOnLongPressUpdateInterval(100); + mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); + + String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); + mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); + mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); + mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); + mAmPmSpinner.setDisplayedValues(stringsForAmPm); + mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); + + // update controls to initial state + updateDateControl(); + updateHourControl(); + updateAmPmControl(); + + set24HourView(is24HourView); + + // set to current time + setCurrentDate(date); + + setEnabled(isEnabled()); + + // set the content descriptions + mInitialising = false; + } + + @Override + public void setEnabled(boolean enabled) { + if (mIsEnabled == enabled) { + return; + } + super.setEnabled(enabled); + mDateSpinner.setEnabled(enabled); + mMinuteSpinner.setEnabled(enabled); + mHourSpinner.setEnabled(enabled); + mAmPmSpinner.setEnabled(enabled); + mIsEnabled = enabled; + } + + @Override + public boolean isEnabled() { + return mIsEnabled; + } + + /** + * Get the current date in millis + * + * @return the current date in millis + */ + public long getCurrentDateInTimeMillis() { + return mDate.getTimeInMillis(); + } + + /** + * Set the current date + * + * @param date The current date in millis + */ + public void setCurrentDate(long date) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(date); + setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), + cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); + } + + /** + * Set the current date + * + * @param year The current year + * @param month The current month + * @param dayOfMonth The current dayOfMonth + * @param hourOfDay The current hourOfDay + * @param minute The current minute + */ + public void setCurrentDate(int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + setCurrentYear(year); + setCurrentMonth(month); + setCurrentDay(dayOfMonth); + setCurrentHour(hourOfDay); + setCurrentMinute(minute); + } + + /** + * Get current year + * + * @return The current year + */ + public int getCurrentYear() { + return mDate.get(Calendar.YEAR); + } + + /** + * Set current year + * + * @param year The current year + */ + public void setCurrentYear(int year) { + if (!mInitialising && year == getCurrentYear()) { + return; + } + mDate.set(Calendar.YEAR, year); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current month in the year + * + * @return The current month in the year + */ + public int getCurrentMonth() { + return mDate.get(Calendar.MONTH); + } + + /** + * Set current month in the year + * + * @param month The month in the year + */ + public void setCurrentMonth(int month) { + if (!mInitialising && month == getCurrentMonth()) { + return; + } + mDate.set(Calendar.MONTH, month); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current day of the month + * + * @return The day of the month + */ + public int getCurrentDay() { + return mDate.get(Calendar.DAY_OF_MONTH); + } + + /** + * Set current day of the month + * + * @param dayOfMonth The day of the month + */ + public void setCurrentDay(int dayOfMonth) { + if (!mInitialising && dayOfMonth == getCurrentDay()) { + return; + } + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current hour in 24 hour mode, in the range (0~23) + * @return The current hour in 24 hour mode + */ + public int getCurrentHourOfDay() { + return mDate.get(Calendar.HOUR_OF_DAY); + } + + private int getCurrentHour() { + if (mIs24HourView){ + return getCurrentHourOfDay(); + } else { + int hour = getCurrentHourOfDay(); + if (hour > HOURS_IN_HALF_DAY) { + return hour - HOURS_IN_HALF_DAY; + } else { + return hour == 0 ? HOURS_IN_HALF_DAY : hour; + } + } + } + + /** + * Set current hour in 24 hour mode, in the range (0~23) + * + * @param hourOfDay + */ + public void setCurrentHour(int hourOfDay) { + if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { + return; + } + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + if (!mIs24HourView) { + if (hourOfDay >= HOURS_IN_HALF_DAY) { + mIsAm = false; + if (hourOfDay > HOURS_IN_HALF_DAY) { + hourOfDay -= HOURS_IN_HALF_DAY; + } + } else { + mIsAm = true; + if (hourOfDay == 0) { + hourOfDay = HOURS_IN_HALF_DAY; + } + } + updateAmPmControl(); + } + mHourSpinner.setValue(hourOfDay); + onDateTimeChanged(); + } + + /** + * Get currentMinute + * + * @return The Current Minute + */ + public int getCurrentMinute() { + return mDate.get(Calendar.MINUTE); + } + + /** + * Set current minute + */ + public void setCurrentMinute(int minute) { + if (!mInitialising && minute == getCurrentMinute()) { + return; + } + mMinuteSpinner.setValue(minute); + mDate.set(Calendar.MINUTE, minute); + onDateTimeChanged(); + } + + /** + * @return true if this is in 24 hour view else false. + */ + public boolean is24HourView () { + return mIs24HourView; + } + + /** + * Set whether in 24 hour or AM/PM mode. + * + * @param is24HourView True for 24 hour mode. False for AM/PM mode. + */ + public void set24HourView(boolean is24HourView) { + if (mIs24HourView == is24HourView) { + return; + } + mIs24HourView = is24HourView; + mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); + int hour = getCurrentHourOfDay(); + updateHourControl(); + setCurrentHour(hour); + updateAmPmControl(); + } + + private void updateDateControl() { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); + mDateSpinner.setDisplayedValues(null); + for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { + cal.add(Calendar.DAY_OF_YEAR, 1); + mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); + } + mDateSpinner.setDisplayedValues(mDateDisplayValues); + mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); + mDateSpinner.invalidate(); + } + + private void updateAmPmControl() { + if (mIs24HourView) { + mAmPmSpinner.setVisibility(View.GONE); + } else { + int index = mIsAm ? Calendar.AM : Calendar.PM; + mAmPmSpinner.setValue(index); + mAmPmSpinner.setVisibility(View.VISIBLE); + } + } + + private void updateHourControl() { + if (mIs24HourView) { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); + } else { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); + } + } + + /** + * Set the callback that indicates the 'Set' button has been pressed. + * @param callback the callback, if null will do nothing + */ + public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { + mOnDateTimeChangedListener = callback; + } + + private void onDateTimeChanged() { + if (mOnDateTimeChangedListener != null) { + mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), + getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); + } + } +} diff --git a/doc/notes/ui/DateTimePickerDialog.java b/doc/notes/ui/DateTimePickerDialog.java new file mode 100644 index 0000000..2c47ba4 --- /dev/null +++ b/doc/notes/ui/DateTimePickerDialog.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import java.util.Calendar; + +import net.micode.notes.R; +import net.micode.notes.ui.DateTimePicker; +import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.text.format.DateFormat; +import android.text.format.DateUtils; + +public class DateTimePickerDialog extends AlertDialog implements OnClickListener { + + private Calendar mDate = Calendar.getInstance(); + private boolean mIs24HourView; + private OnDateTimeSetListener mOnDateTimeSetListener; + private DateTimePicker mDateTimePicker; + + public interface OnDateTimeSetListener { + void OnDateTimeSet(AlertDialog dialog, long date); + } + + public DateTimePickerDialog(Context context, long date) { + super(context); + mDateTimePicker = new DateTimePicker(context); + setView(mDateTimePicker); + mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { + public void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + mDate.set(Calendar.YEAR, year); + mDate.set(Calendar.MONTH, month); + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + mDate.set(Calendar.MINUTE, minute); + updateTitle(mDate.getTimeInMillis()); + } + }); + mDate.setTimeInMillis(date); + mDate.set(Calendar.SECOND, 0); + mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); + setButton(context.getString(R.string.datetime_dialog_ok), this); + setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + set24HourView(DateFormat.is24HourFormat(this.getContext())); + updateTitle(mDate.getTimeInMillis()); + } + + public void set24HourView(boolean is24HourView) { + mIs24HourView = is24HourView; + } + + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { + mOnDateTimeSetListener = callBack; + } + + private void updateTitle(long date) { + int flag = + DateUtils.FORMAT_SHOW_YEAR | + DateUtils.FORMAT_SHOW_DATE | + DateUtils.FORMAT_SHOW_TIME; + flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; + setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); + } + + public void onClick(DialogInterface arg0, int arg1) { + if (mOnDateTimeSetListener != null) { + mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); + } + } + +} \ No newline at end of file diff --git a/doc/notes/ui/DropdownMenu.java b/doc/notes/ui/DropdownMenu.java new file mode 100644 index 0000000..613dc74 --- /dev/null +++ b/doc/notes/ui/DropdownMenu.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnMenuItemClickListener; + +import net.micode.notes.R; + +public class DropdownMenu { + private Button mButton; + private PopupMenu mPopupMenu; + private Menu mMenu; + + public DropdownMenu(Context context, Button button, int menuId) { + mButton = button; + mButton.setBackgroundResource(R.drawable.dropdown_icon); + mPopupMenu = new PopupMenu(context, mButton); + mMenu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + mButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + mPopupMenu.show(); + } + }); + } + + public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { + if (mPopupMenu != null) { + mPopupMenu.setOnMenuItemClickListener(listener); + } + } + + public MenuItem findItem(int id) { + return mMenu.findItem(id); + } + + public void setTitle(CharSequence title) { + mButton.setText(title); + } +} diff --git a/doc/notes/ui/FoldersListAdapter.java b/doc/notes/ui/FoldersListAdapter.java new file mode 100644 index 0000000..96b77da --- /dev/null +++ b/doc/notes/ui/FoldersListAdapter.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; + + +public class FoldersListAdapter extends CursorAdapter { + public static final String [] PROJECTION = { + NoteColumns.ID, + NoteColumns.SNIPPET + }; + + public static final int ID_COLUMN = 0; + public static final int NAME_COLUMN = 1; + + public FoldersListAdapter(Context context, Cursor c) { + super(context, c); + // TODO Auto-generated constructor stub + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return new FolderListItem(context); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + if (view instanceof FolderListItem) { + String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + ((FolderListItem) view).bind(folderName); + } + } + + public String getFolderName(Context context, int position) { + Cursor cursor = (Cursor) getItem(position); + return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + } + + private class FolderListItem extends LinearLayout { + private TextView mName; + + public FolderListItem(Context context) { + super(context); + inflate(context, R.layout.folder_list_item, this); + mName = (TextView) findViewById(R.id.tv_folder_name); + } + + public void bind(String name) { + mName.setText(name); + } + } + +} diff --git a/doc/notes/ui/NoteEditActivity.java b/doc/notes/ui/NoteEditActivity.java new file mode 100644 index 0000000..96a9ff8 --- /dev/null +++ b/doc/notes/ui/NoteEditActivity.java @@ -0,0 +1,873 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlarmManager; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.app.SearchManager; +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Paint; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.format.DateUtils; +import android.text.style.BackgroundColorSpan; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.model.WorkingNote; +import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.tool.ResourceParser.TextAppearanceResources; +import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; +import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; +import net.micode.notes.widget.NoteWidgetProvider_2x; +import net.micode.notes.widget.NoteWidgetProvider_4x; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class NoteEditActivity extends Activity implements OnClickListener, + NoteSettingChangedListener, OnTextViewChangeListener { + private class HeadViewHolder { + public TextView tvModified; + + public ImageView ivAlertIcon; + + public TextView tvAlertDate; + + public ImageView ibSetBgColor; + } + + private static final Map sBgSelectorBtnsMap = new HashMap(); + static { + sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); + sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); + sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); + sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); + sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); + } + + private static final Map sBgSelectorSelectionMap = new HashMap(); + static { + sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); + sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); + sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); + sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); + sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); + } + + private static final Map sFontSizeBtnsMap = new HashMap(); + static { + sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); + sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); + sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); + sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); + } + + private static final Map sFontSelectorSelectionMap = new HashMap(); + static { + sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); + } + + private static final String TAG = "NoteEditActivity"; + + private HeadViewHolder mNoteHeaderHolder; + + private View mHeadViewPanel; + + private View mNoteBgColorSelector; + + private View mFontSizeSelector; + + private EditText mNoteEditor; + + private View mNoteEditorPanel; + + private WorkingNote mWorkingNote; + + private SharedPreferences mSharedPrefs; + private int mFontSizeId; + + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; + + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; + + public static final String TAG_CHECKED = String.valueOf('\u221A'); + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); + + private LinearLayout mEditTextList; + + private String mUserQuery; + private Pattern mPattern; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.setContentView(R.layout.note_edit); + + if (savedInstanceState == null && !initActivityState(getIntent())) { + finish(); + return; + } + initResources(); + } + + /** + * Current activity may be killed when the memory is low. Once it is killed, for another time + * user load this activity, we should restore the former state + */ + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); + if (!initActivityState(intent)) { + finish(); + return; + } + Log.d(TAG, "Restoring from killed activity"); + } + } + + private boolean initActivityState(Intent intent) { + /** + * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, + * then jump to the NotesListActivity + */ + mWorkingNote = null; + if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { + long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); + mUserQuery = ""; + + /** + * Starting from the searched result + */ + if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { + noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); + mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); + } + + if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { + Intent jump = new Intent(this, NotesListActivity.class); + startActivity(jump); + showToast(R.string.error_note_not_exist); + finish(); + return false; + } else { + mWorkingNote = WorkingNote.load(this, noteId); + if (mWorkingNote == null) { + Log.e(TAG, "load note failed with note id" + noteId); + finish(); + return false; + } + } + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { + // New note + long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); + int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, + Notes.TYPE_WIDGET_INVALIDE); + int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, + ResourceParser.getDefaultBgId(this)); + + // Parse call-record note + String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); + long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); + if (callDate != 0 && phoneNumber != null) { + if (TextUtils.isEmpty(phoneNumber)) { + Log.w(TAG, "The call record number is null"); + } + long noteId = 0; + if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), + phoneNumber, callDate)) > 0) { + mWorkingNote = WorkingNote.load(this, noteId); + if (mWorkingNote == null) { + Log.e(TAG, "load call note failed with note id" + noteId); + finish(); + return false; + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, + widgetType, bgResId); + mWorkingNote.convertToCallNote(phoneNumber, callDate); + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, + bgResId); + } + + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } else { + Log.e(TAG, "Intent not specified action, should not support"); + finish(); + return false; + } + mWorkingNote.setOnSettingStatusChangedListener(this); + return true; + } + + @Override + protected void onResume() { + super.onResume(); + initNoteScreen(); + } + + private void initNoteScreen() { + mNoteEditor.setTextAppearance(this, TextAppearanceResources + .getTexAppearanceResource(mFontSizeId)); + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + switchToListMode(mWorkingNote.getContent()); + } else { + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + mNoteEditor.setSelection(mNoteEditor.getText().length()); + } + for (Integer id : sBgSelectorSelectionMap.keySet()) { + findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); + } + mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + + mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, + mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME + | DateUtils.FORMAT_SHOW_YEAR)); + + /** + * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker + * is not ready + */ + showAlertHeader(); + } + + private void showAlertHeader() { + if (mWorkingNote.hasClockAlert()) { + long time = System.currentTimeMillis(); + if (time > mWorkingNote.getAlertDate()) { + mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); + } else { + mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( + mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); + } + mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); + mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); + } else { + mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); + mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); + }; + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + initActivityState(intent); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + /** + * For new note without note id, we should firstly save it to + * generate a id. If the editing note is not worth saving, there + * is no id which is equivalent to create new note + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); + Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (mNoteBgColorSelector.getVisibility() == View.VISIBLE + && !inRangeOfView(mNoteBgColorSelector, ev)) { + mNoteBgColorSelector.setVisibility(View.GONE); + return true; + } + + if (mFontSizeSelector.getVisibility() == View.VISIBLE + && !inRangeOfView(mFontSizeSelector, ev)) { + mFontSizeSelector.setVisibility(View.GONE); + return true; + } + return super.dispatchTouchEvent(ev); + } + + private boolean inRangeOfView(View view, MotionEvent ev) { + int []location = new int[2]; + view.getLocationOnScreen(location); + int x = location[0]; + int y = location[1]; + if (ev.getX() < x + || ev.getX() > (x + view.getWidth()) + || ev.getY() < y + || ev.getY() > (y + view.getHeight())) { + return false; + } + return true; + } + + private void initResources() { + mHeadViewPanel = findViewById(R.id.note_title); + mNoteHeaderHolder = new HeadViewHolder(); + mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); + mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon); + mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); + mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); + mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); + mNoteEditor = (EditText) findViewById(R.id.note_edit_view); + mNoteEditorPanel = findViewById(R.id.sv_note_edit); + mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); + for (int id : sBgSelectorBtnsMap.keySet()) { + ImageView iv = (ImageView) findViewById(id); + iv.setOnClickListener(this); + } + + mFontSizeSelector = findViewById(R.id.font_size_selector); + for (int id : sFontSizeBtnsMap.keySet()) { + View view = findViewById(id); + view.setOnClickListener(this); + }; + mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); + /** + * HACKME: Fix bug of store the resource id in shared preference. + * The id may larger than the length of resources, in this case, + * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + */ + if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { + mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; + } + mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); + } + + @Override + protected void onPause() { + super.onPause(); + if(saveNote()) { + Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); + } + clearSettingState(); + } + + private void updateWidget() { + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { + intent.setClass(this, NoteWidgetProvider_2x.class); + } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { + intent.setClass(this, NoteWidgetProvider_4x.class); + } else { + Log.e(TAG, "Unspported widget type"); + return; + } + + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { + mWorkingNote.getWidgetId() + }); + + sendBroadcast(intent); + setResult(RESULT_OK, intent); + } + + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.btn_set_bg_color) { + mNoteBgColorSelector.setVisibility(View.VISIBLE); + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + - View.VISIBLE); + } else if (sBgSelectorBtnsMap.containsKey(id)) { + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + View.GONE); + mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); + mNoteBgColorSelector.setVisibility(View.GONE); + } else if (sFontSizeBtnsMap.containsKey(id)) { + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); + mFontSizeId = sFontSizeBtnsMap.get(id); + mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + getWorkingText(); + switchToListMode(mWorkingNote.getContent()); + } else { + mNoteEditor.setTextAppearance(this, + TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); + } + mFontSizeSelector.setVisibility(View.GONE); + } + } + + @Override + public void onBackPressed() { + if(clearSettingState()) { + return; + } + + saveNote(); + super.onBackPressed(); + } + + private boolean clearSettingState() { + if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { + mNoteBgColorSelector.setVisibility(View.GONE); + return true; + } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { + mFontSizeSelector.setVisibility(View.GONE); + return true; + } + return false; + } + + public void onBackgroundColorChanged() { + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + View.VISIBLE); + mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + if (isFinishing()) { + return true; + } + clearSettingState(); + menu.clear(); + if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { + getMenuInflater().inflate(R.menu.call_note_edit, menu); + } else { + getMenuInflater().inflate(R.menu.note_edit, menu); + } + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); + } else { + menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); + } + if (mWorkingNote.hasClockAlert()) { + menu.findItem(R.id.menu_alert).setVisible(false); + } else { + menu.findItem(R.id.menu_delete_remind).setVisible(false); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_new_note: + createNewNote(); + break; + case R.id.menu_delete: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_note)); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteCurrentNote(); + finish(); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case R.id.menu_font_size: + mFontSizeSelector.setVisibility(View.VISIBLE); + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); + break; + case R.id.menu_list_mode: + mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? + TextNote.MODE_CHECK_LIST : 0); + break; + case R.id.menu_share: + getWorkingText(); + sendTo(this, mWorkingNote.getContent()); + break; + case R.id.menu_send_to_desktop: + sendToDesktop(); + break; + case R.id.menu_alert: + setReminder(); + break; + case R.id.menu_delete_remind: + mWorkingNote.setAlertDate(0, false); + break; + default: + break; + } + return true; + } + + private void setReminder() { + DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); + d.setOnDateTimeSetListener(new OnDateTimeSetListener() { + public void OnDateTimeSet(AlertDialog dialog, long date) { + mWorkingNote.setAlertDate(date , true); + } + }); + d.show(); + } + + /** + * Share note to apps that support {@link Intent#ACTION_SEND} action + * and {@text/plain} type + */ + private void sendTo(Context context, String info) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.putExtra(Intent.EXTRA_TEXT, info); + intent.setType("text/plain"); + context.startActivity(intent); + } + + private void createNewNote() { + // Firstly, save current editing notes + saveNote(); + + // For safety, start a new NoteEditActivity + finish(); + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); + startActivity(intent); + } + + private void deleteCurrentNote() { + if (mWorkingNote.existInDatabase()) { + HashSet ids = new HashSet(); + long id = mWorkingNote.getNoteId(); + if (id != Notes.ID_ROOT_FOLDER) { + ids.add(id); + } else { + Log.d(TAG, "Wrong note id, should not happen"); + } + if (!isSyncMode()) { + if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { + Log.e(TAG, "Delete Note error"); + } + } else { + if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { + Log.e(TAG, "Move notes to trash folder error, should not happens"); + } + } + } + mWorkingNote.markDeleted(true); + } + + private boolean isSyncMode() { + return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; + } + + public void onClockAlertChanged(long date, boolean set) { + /** + * User could set clock to an unsaved note, so before setting the + * alert clock, we should save the note first + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + if (mWorkingNote.getNoteId() > 0) { + Intent intent = new Intent(this, AlarmReceiver.class); + intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); + AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); + showAlertHeader(); + if(!set) { + alarmManager.cancel(pendingIntent); + } else { + alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); + } + } else { + /** + * There is the condition that user has input nothing (the note is + * not worthy saving), we have no note id, remind the user that he + * should input something + */ + Log.e(TAG, "Clock alert setting error"); + showToast(R.string.error_note_empty_for_clock); + } + } + + public void onWidgetChanged() { + updateWidget(); + } + + public void onEditTextDelete(int index, String text) { + int childCount = mEditTextList.getChildCount(); + if (childCount == 1) { + return; + } + + for (int i = index + 1; i < childCount; i++) { + ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) + .setIndex(i - 1); + } + + mEditTextList.removeViewAt(index); + NoteEditText edit = null; + if(index == 0) { + edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( + R.id.et_edit_text); + } else { + edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( + R.id.et_edit_text); + } + int length = edit.length(); + edit.append(text); + edit.requestFocus(); + edit.setSelection(length); + } + + public void onEditTextEnter(int index, String text) { + /** + * Should not happen, check for debug + */ + if(index > mEditTextList.getChildCount()) { + Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); + } + + View view = getListItem(text, index); + mEditTextList.addView(view, index); + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + edit.requestFocus(); + edit.setSelection(0); + for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { + ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) + .setIndex(i); + } + } + + private void switchToListMode(String text) { + mEditTextList.removeAllViews(); + String[] items = text.split("\n"); + int index = 0; + for (String item : items) { + if(!TextUtils.isEmpty(item)) { + mEditTextList.addView(getListItem(item, index)); + index++; + } + } + mEditTextList.addView(getListItem("", index)); + mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); + + mNoteEditor.setVisibility(View.GONE); + mEditTextList.setVisibility(View.VISIBLE); + } + + private Spannable getHighlightQueryResult(String fullText, String userQuery) { + SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); + if (!TextUtils.isEmpty(userQuery)) { + mPattern = Pattern.compile(userQuery); + Matcher m = mPattern.matcher(fullText); + int start = 0; + while (m.find(start)) { + spannable.setSpan( + new BackgroundColorSpan(this.getResources().getColor( + R.color.user_query_highlight)), m.start(), m.end(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + start = m.end(); + } + } + return spannable; + } + + private View getListItem(String item, int index) { + View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); + final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); + CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); + cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); + } + } + }); + + if (item.startsWith(TAG_CHECKED)) { + cb.setChecked(true); + edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + item = item.substring(TAG_CHECKED.length(), item.length()).trim(); + } else if (item.startsWith(TAG_UNCHECKED)) { + cb.setChecked(false); + edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); + item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); + } + + edit.setOnTextViewChangeListener(this); + edit.setIndex(index); + edit.setText(getHighlightQueryResult(item, mUserQuery)); + return view; + } + + public void onTextChange(int index, boolean hasText) { + if (index >= mEditTextList.getChildCount()) { + Log.e(TAG, "Wrong index, should not happen"); + return; + } + if(hasText) { + mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); + } else { + mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); + } + } + + public void onCheckListModeChanged(int oldMode, int newMode) { + if (newMode == TextNote.MODE_CHECK_LIST) { + switchToListMode(mNoteEditor.getText().toString()); + } else { + if (!getWorkingText()) { + mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", + "")); + } + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + mEditTextList.setVisibility(View.GONE); + mNoteEditor.setVisibility(View.VISIBLE); + } + } + + private boolean getWorkingText() { + boolean hasChecked = false; + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mEditTextList.getChildCount(); i++) { + View view = mEditTextList.getChildAt(i); + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + if (!TextUtils.isEmpty(edit.getText())) { + if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { + sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); + hasChecked = true; + } else { + sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); + } + } + } + mWorkingNote.setWorkingText(sb.toString()); + } else { + mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); + } + return hasChecked; + } + + private boolean saveNote() { + getWorkingText(); + boolean saved = mWorkingNote.saveNote(); + if (saved) { + /** + * There are two modes from List view to edit view, open one note, + * create/edit a node. Opening node requires to the original + * position in the list when back from edit view, while creating a + * new node requires to the top of the list. This code + * {@link #RESULT_OK} is used to identify the create/edit state + */ + setResult(RESULT_OK); + } + return saved; + } + + private void sendToDesktop() { + /** + * Before send message to home, we should make sure that current + * editing note is exists in databases. So, for new note, firstly + * save it + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + + if (mWorkingNote.getNoteId() > 0) { + Intent sender = new Intent(); + Intent shortcutIntent = new Intent(this, NoteEditActivity.class); + shortcutIntent.setAction(Intent.ACTION_VIEW); + shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); + sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); + sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, + makeShortcutIconTitle(mWorkingNote.getContent())); + sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, + Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); + sender.putExtra("duplicate", true); + sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); + showToast(R.string.info_note_enter_desktop); + sendBroadcast(sender); + } else { + /** + * There is the condition that user has input nothing (the note is + * not worthy saving), we have no note id, remind the user that he + * should input something + */ + Log.e(TAG, "Send to desktop error"); + showToast(R.string.error_note_empty_for_send_to_desktop); + } + } + + private String makeShortcutIconTitle(String content) { + content = content.replace(TAG_CHECKED, ""); + content = content.replace(TAG_UNCHECKED, ""); + return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, + SHORTCUT_ICON_TITLE_MAX_LEN) : content; + } + + private void showToast(int resId) { + showToast(resId, Toast.LENGTH_SHORT); + } + + private void showToast(int resId, int duration) { + Toast.makeText(this, resId, duration).show(); + } +} diff --git a/doc/notes/ui/NoteEditText.java b/doc/notes/ui/NoteEditText.java new file mode 100644 index 0000000..2afe2a8 --- /dev/null +++ b/doc/notes/ui/NoteEditText.java @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.graphics.Rect; +import android.text.Layout; +import android.text.Selection; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.URLSpan; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.MotionEvent; +import android.widget.EditText; + +import net.micode.notes.R; + +import java.util.HashMap; +import java.util.Map; + +public class NoteEditText extends EditText { + private static final String TAG = "NoteEditText"; + private int mIndex; + private int mSelectionStartBeforeDelete; + + private static final String SCHEME_TEL = "tel:" ; + private static final String SCHEME_HTTP = "http:" ; + private static final String SCHEME_EMAIL = "mailto:" ; + + private static final Map sSchemaActionResMap = new HashMap(); + static { + sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); + sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); + sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); + } + + /** + * Call by the {@link NoteEditActivity} to delete or add edit text + */ + public interface OnTextViewChangeListener { + /** + * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens + * and the text is null + */ + void onEditTextDelete(int index, String text); + + /** + * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} + * happen + */ + void onEditTextEnter(int index, String text); + + /** + * Hide or show item option when text change + */ + void onTextChange(int index, boolean hasText); + } + + private OnTextViewChangeListener mOnTextViewChangeListener; + + public NoteEditText(Context context) { + super(context, null); + mIndex = 0; + } + + public void setIndex(int index) { + mIndex = index; + } + + public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { + mOnTextViewChangeListener = listener; + } + + public NoteEditText(Context context, AttributeSet attrs) { + super(context, attrs, android.R.attr.editTextStyle); + } + + public NoteEditText(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + // TODO Auto-generated constructor stub + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + + int x = (int) event.getX(); + int y = (int) event.getY(); + x -= getTotalPaddingLeft(); + y -= getTotalPaddingTop(); + x += getScrollX(); + y += getScrollY(); + + Layout layout = getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + Selection.setSelection(getText(), off); + break; + } + + return super.onTouchEvent(event); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + return false; + } + break; + case KeyEvent.KEYCODE_DEL: + mSelectionStartBeforeDelete = getSelectionStart(); + break; + default: + break; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + switch(keyCode) { + case KeyEvent.KEYCODE_DEL: + if (mOnTextViewChangeListener != null) { + if (0 == mSelectionStartBeforeDelete && mIndex != 0) { + mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); + return true; + } + } else { + Log.d(TAG, "OnTextViewChangeListener was not seted"); + } + break; + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + int selectionStart = getSelectionStart(); + String text = getText().subSequence(selectionStart, length()).toString(); + setText(getText().subSequence(0, selectionStart)); + mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); + } else { + Log.d(TAG, "OnTextViewChangeListener was not seted"); + } + break; + default: + break; + } + return super.onKeyUp(keyCode, event); + } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + if (mOnTextViewChangeListener != null) { + if (!focused && TextUtils.isEmpty(getText())) { + mOnTextViewChangeListener.onTextChange(mIndex, false); + } else { + mOnTextViewChangeListener.onTextChange(mIndex, true); + } + } + super.onFocusChanged(focused, direction, previouslyFocusedRect); + } + + @Override + protected void onCreateContextMenu(ContextMenu menu) { + if (getText() instanceof Spanned) { + int selStart = getSelectionStart(); + int selEnd = getSelectionEnd(); + + int min = Math.min(selStart, selEnd); + int max = Math.max(selStart, selEnd); + + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + if (urls.length == 1) { + int defaultResId = 0; + for(String schema: sSchemaActionResMap.keySet()) { + if(urls[0].getURL().indexOf(schema) >= 0) { + defaultResId = sSchemaActionResMap.get(schema); + break; + } + } + + if (defaultResId == 0) { + defaultResId = R.string.note_link_other; + } + + menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( + new OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + // goto a new intent + urls[0].onClick(NoteEditText.this); + return true; + } + }); + } + } + super.onCreateContextMenu(menu); + } +} diff --git a/doc/notes/ui/NoteItemData.java b/doc/notes/ui/NoteItemData.java new file mode 100644 index 0000000..0f5a878 --- /dev/null +++ b/doc/notes/ui/NoteItemData.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; + +import net.micode.notes.data.Contact; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.DataUtils; + + +public class NoteItemData { + static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, + NoteColumns.HAS_ATTACHMENT, + NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, + NoteColumns.PARENT_ID, + NoteColumns.SNIPPET, + NoteColumns.TYPE, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + }; + + private static final int ID_COLUMN = 0; + private static final int ALERTED_DATE_COLUMN = 1; + private static final int BG_COLOR_ID_COLUMN = 2; + private static final int CREATED_DATE_COLUMN = 3; + private static final int HAS_ATTACHMENT_COLUMN = 4; + private static final int MODIFIED_DATE_COLUMN = 5; + private static final int NOTES_COUNT_COLUMN = 6; + private static final int PARENT_ID_COLUMN = 7; + private static final int SNIPPET_COLUMN = 8; + private static final int TYPE_COLUMN = 9; + private static final int WIDGET_ID_COLUMN = 10; + private static final int WIDGET_TYPE_COLUMN = 11; + + private long mId; + private long mAlertDate; + private int mBgColorId; + private long mCreatedDate; + private boolean mHasAttachment; + private long mModifiedDate; + private int mNotesCount; + private long mParentId; + private String mSnippet; + private int mType; + private int mWidgetId; + private int mWidgetType; + private String mName; + private String mPhoneNumber; + + private boolean mIsLastItem; + private boolean mIsFirstItem; + private boolean mIsOnlyOneItem; + private boolean mIsOneNoteFollowingFolder; + private boolean mIsMultiNotesFollowingFolder; + + public NoteItemData(Context context, Cursor cursor) { + mId = cursor.getLong(ID_COLUMN); + mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); + mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; + mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); + mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); + mParentId = cursor.getLong(PARENT_ID_COLUMN); + mSnippet = cursor.getString(SNIPPET_COLUMN); + mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( + NoteEditActivity.TAG_UNCHECKED, ""); + mType = cursor.getInt(TYPE_COLUMN); + mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); + + mPhoneNumber = ""; + if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { + mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); + if (!TextUtils.isEmpty(mPhoneNumber)) { + mName = Contact.getContact(context, mPhoneNumber); + if (mName == null) { + mName = mPhoneNumber; + } + } + } + + if (mName == null) { + mName = ""; + } + checkPostion(cursor); + } + + private void checkPostion(Cursor cursor) { + mIsLastItem = cursor.isLast() ? true : false; + mIsFirstItem = cursor.isFirst() ? true : false; + mIsOnlyOneItem = (cursor.getCount() == 1); + mIsMultiNotesFollowingFolder = false; + mIsOneNoteFollowingFolder = false; + + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { + int position = cursor.getPosition(); + if (cursor.moveToPrevious()) { + if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER + || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { + if (cursor.getCount() > (position + 1)) { + mIsMultiNotesFollowingFolder = true; + } else { + mIsOneNoteFollowingFolder = true; + } + } + if (!cursor.moveToNext()) { + throw new IllegalStateException("cursor move to previous but can't move back"); + } + } + } + } + + public boolean isOneFollowingFolder() { + return mIsOneNoteFollowingFolder; + } + + public boolean isMultiFollowingFolder() { + return mIsMultiNotesFollowingFolder; + } + + public boolean isLast() { + return mIsLastItem; + } + + public String getCallName() { + return mName; + } + + public boolean isFirst() { + return mIsFirstItem; + } + + public boolean isSingle() { + return mIsOnlyOneItem; + } + + public long getId() { + return mId; + } + + public long getAlertDate() { + return mAlertDate; + } + + public long getCreatedDate() { + return mCreatedDate; + } + + public boolean hasAttachment() { + return mHasAttachment; + } + + public long getModifiedDate() { + return mModifiedDate; + } + + public int getBgColorId() { + return mBgColorId; + } + + public long getParentId() { + return mParentId; + } + + public int getNotesCount() { + return mNotesCount; + } + + public long getFolderId () { + return mParentId; + } + + public int getType() { + return mType; + } + + public int getWidgetType() { + return mWidgetType; + } + + public int getWidgetId() { + return mWidgetId; + } + + public String getSnippet() { + return mSnippet; + } + + public boolean hasAlert() { + return (mAlertDate > 0); + } + + public boolean isCallRecord() { + return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); + } + + public static int getNoteType(Cursor cursor) { + return cursor.getInt(TYPE_COLUMN); + } +} diff --git a/doc/notes/ui/NotesListActivity.java b/doc/notes/ui/NotesListActivity.java new file mode 100644 index 0000000..e843aec --- /dev/null +++ b/doc/notes/ui/NotesListActivity.java @@ -0,0 +1,954 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.appwidget.AppWidgetManager; +import android.content.AsyncQueryHandler; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Display; +import android.view.HapticFeedbackConstants; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnCreateContextMenuListener; +import android.view.View.OnTouchListener; +import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.PopupMenu; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.remote.GTaskSyncService; +import net.micode.notes.model.WorkingNote; +import net.micode.notes.tool.BackupUtils; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; +import net.micode.notes.widget.NoteWidgetProvider_2x; +import net.micode.notes.widget.NoteWidgetProvider_4x; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashSet; + +public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { + private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; + + private static final int FOLDER_LIST_QUERY_TOKEN = 1; + + private static final int MENU_FOLDER_DELETE = 0; + + private static final int MENU_FOLDER_VIEW = 1; + + private static final int MENU_FOLDER_CHANGE_NAME = 2; + + private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; + + private enum ListEditState { + NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER + }; + + private ListEditState mState; + + private BackgroundQueryHandler mBackgroundQueryHandler; + + private NotesListAdapter mNotesListAdapter; + + private ListView mNotesListView; + + private Button mAddNewNote; + + private boolean mDispatch; + + private int mOriginY; + + private int mDispatchY; + + private TextView mTitleBar; + + private long mCurrentFolderId; + + private ContentResolver mContentResolver; + + private ModeCallback mModeCallBack; + + private static final String TAG = "NotesListActivity"; + + public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; + + private NoteItemData mFocusNoteDataItem; + + private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; + + private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" + + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " + + NoteColumns.NOTES_COUNT + ">0)"; + + private final static int REQUEST_CODE_OPEN_NODE = 102; + private final static int REQUEST_CODE_NEW_NODE = 103; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.note_list); + initResources(); + + /** + * Insert an introduction when user firstly use this application + */ + setAppInfoFromRawRes(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK + && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { + mNotesListAdapter.changeCursor(null); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + private void setAppInfoFromRawRes() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); + if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { + StringBuilder sb = new StringBuilder(); + InputStream in = null; + try { + in = getResources().openRawResource(R.raw.introduction); + if (in != null) { + InputStreamReader isr = new InputStreamReader(in); + BufferedReader br = new BufferedReader(isr); + char [] buf = new char[1024]; + int len = 0; + while ((len = br.read(buf)) > 0) { + sb.append(buf, 0, len); + } + } else { + Log.e(TAG, "Read introduction file error"); + return; + } + } catch (IOException e) { + e.printStackTrace(); + return; + } finally { + if(in != null) { + try { + in.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, + AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, + ResourceParser.RED); + note.setWorkingText(sb.toString()); + if (note.saveNote()) { + sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); + } else { + Log.e(TAG, "Save introduction note error"); + return; + } + } + } + + @Override + protected void onStart() { + super.onStart(); + startAsyncNotesListQuery(); + } + + private void initResources() { + mContentResolver = this.getContentResolver(); + mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mNotesListView = (ListView) findViewById(R.id.notes_list); + mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), + null, false); + mNotesListView.setOnItemClickListener(new OnListItemClickListener()); + mNotesListView.setOnItemLongClickListener(this); + mNotesListAdapter = new NotesListAdapter(this); + mNotesListView.setAdapter(mNotesListAdapter); + mAddNewNote = (Button) findViewById(R.id.btn_new_note); + mAddNewNote.setOnClickListener(this); + mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); + mDispatch = false; + mDispatchY = 0; + mOriginY = 0; + mTitleBar = (TextView) findViewById(R.id.tv_title_bar); + mState = ListEditState.NOTE_LIST; + mModeCallBack = new ModeCallback(); + } + + private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { + private DropdownMenu mDropDownMenu; + private ActionMode mActionMode; + private MenuItem mMoveMenu; + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + getMenuInflater().inflate(R.menu.note_list_options, menu); + menu.findItem(R.id.delete).setOnMenuItemClickListener(this); + mMoveMenu = menu.findItem(R.id.move); + if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER + || DataUtils.getUserFolderCount(mContentResolver) == 0) { + mMoveMenu.setVisible(false); + } else { + mMoveMenu.setVisible(true); + mMoveMenu.setOnMenuItemClickListener(this); + } + mActionMode = mode; + mNotesListAdapter.setChoiceMode(true); + mNotesListView.setLongClickable(false); + mAddNewNote.setVisibility(View.GONE); + + View customView = LayoutInflater.from(NotesListActivity.this).inflate( + R.layout.note_list_dropdown_menu, null); + mode.setCustomView(customView); + mDropDownMenu = new DropdownMenu(NotesListActivity.this, + (Button) customView.findViewById(R.id.selection_menu), + R.menu.note_list_dropdown); + mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ + public boolean onMenuItemClick(MenuItem item) { + mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); + updateMenu(); + return true; + } + + }); + return true; + } + + private void updateMenu() { + int selectedCount = mNotesListAdapter.getSelectedCount(); + // Update dropdown menu + String format = getResources().getString(R.string.menu_select_title, selectedCount); + mDropDownMenu.setTitle(format); + MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); + if (item != null) { + if (mNotesListAdapter.isAllSelected()) { + item.setChecked(true); + item.setTitle(R.string.menu_deselect_all); + } else { + item.setChecked(false); + item.setTitle(R.string.menu_select_all); + } + } + } + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + // TODO Auto-generated method stub + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + // TODO Auto-generated method stub + return false; + } + + public void onDestroyActionMode(ActionMode mode) { + mNotesListAdapter.setChoiceMode(false); + mNotesListView.setLongClickable(true); + mAddNewNote.setVisibility(View.VISIBLE); + } + + public void finishActionMode() { + mActionMode.finish(); + } + + public void onItemCheckedStateChanged(ActionMode mode, int position, long id, + boolean checked) { + mNotesListAdapter.setCheckedItem(position, checked); + updateMenu(); + } + + public boolean onMenuItemClick(MenuItem item) { + if (mNotesListAdapter.getSelectedCount() == 0) { + Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), + Toast.LENGTH_SHORT).show(); + return true; + } + + switch (item.getItemId()) { + case R.id.delete: + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_notes, + mNotesListAdapter.getSelectedCount())); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + batchDelete(); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case R.id.move: + startQueryDestinationFolders(); + break; + default: + return false; + } + return true; + } + } + + private class NewNoteOnTouchListener implements OnTouchListener { + + public boolean onTouch(View v, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: { + Display display = getWindowManager().getDefaultDisplay(); + int screenHeight = display.getHeight(); + int newNoteViewHeight = mAddNewNote.getHeight(); + int start = screenHeight - newNoteViewHeight; + int eventY = start + (int) event.getY(); + /** + * Minus TitleBar's height + */ + if (mState == ListEditState.SUB_FOLDER) { + eventY -= mTitleBar.getHeight(); + start -= mTitleBar.getHeight(); + } + /** + * HACKME:When click the transparent part of "New Note" button, dispatch + * the event to the list view behind this button. The transparent part of + * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel) + * and the line top of the button. The coordinate based on left of the "New + * Note" button. The 94 represents maximum height of the transparent part. + * Notice that, if the background of the button changes, the formula should + * also change. This is very bad, just for the UI designer's strong requirement. + */ + if (event.getY() < (event.getX() * (-0.12) + 94)) { + View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 + - mNotesListView.getFooterViewsCount()); + if (view != null && view.getBottom() > start + && (view.getTop() < (start + 94))) { + mOriginY = (int) event.getY(); + mDispatchY = eventY; + event.setLocation(event.getX(), mDispatchY); + mDispatch = true; + return mNotesListView.dispatchTouchEvent(event); + } + } + break; + } + case MotionEvent.ACTION_MOVE: { + if (mDispatch) { + mDispatchY += (int) event.getY() - mOriginY; + event.setLocation(event.getX(), mDispatchY); + return mNotesListView.dispatchTouchEvent(event); + } + break; + } + default: { + if (mDispatch) { + event.setLocation(event.getX(), mDispatchY); + mDispatch = false; + return mNotesListView.dispatchTouchEvent(event); + } + break; + } + } + return false; + } + + }; + + private void startAsyncNotesListQuery() { + String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION + : NORMAL_SELECTION; + mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, + Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + } + + private final class BackgroundQueryHandler extends AsyncQueryHandler { + public BackgroundQueryHandler(ContentResolver contentResolver) { + super(contentResolver); + } + + @Override + protected void onQueryComplete(int token, Object cookie, Cursor cursor) { + switch (token) { + case FOLDER_NOTE_LIST_QUERY_TOKEN: + mNotesListAdapter.changeCursor(cursor); + break; + case FOLDER_LIST_QUERY_TOKEN: + if (cursor != null && cursor.getCount() > 0) { + showFolderListMenu(cursor); + } else { + Log.e(TAG, "Query folder failed"); + } + break; + default: + return; + } + } + } + + private void showFolderListMenu(Cursor cursor) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(R.string.menu_title_select_folder); + final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); + builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + DataUtils.batchMoveToFolder(mContentResolver, + mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); + Toast.makeText( + NotesListActivity.this, + getString(R.string.format_move_notes_to_folder, + mNotesListAdapter.getSelectedCount(), + adapter.getFolderName(NotesListActivity.this, which)), + Toast.LENGTH_SHORT).show(); + mModeCallBack.finishActionMode(); + } + }); + builder.show(); + } + + private void createNewNote() { + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); + this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); + } + + private void batchDelete() { + new AsyncTask>() { + protected HashSet doInBackground(Void... unused) { + HashSet widgets = mNotesListAdapter.getSelectedWidget(); + if (!isSyncMode()) { + // if not synced, delete notes directly + if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter + .getSelectedItemIds())) { + } else { + Log.e(TAG, "Delete notes error, should not happens"); + } + } else { + // in sync mode, we'll move the deleted note into the trash + // folder + if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter + .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { + Log.e(TAG, "Move notes to trash folder error, should not happens"); + } + } + return widgets; + } + + @Override + protected void onPostExecute(HashSet widgets) { + if (widgets != null) { + for (AppWidgetAttribute widget : widgets) { + if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { + updateWidget(widget.widgetId, widget.widgetType); + } + } + } + mModeCallBack.finishActionMode(); + } + }.execute(); + } + + private void deleteFolder(long folderId) { + if (folderId == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Wrong folder id, should not happen " + folderId); + return; + } + + HashSet ids = new HashSet(); + ids.add(folderId); + HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, + folderId); + if (!isSyncMode()) { + // if not synced, delete folder directly + DataUtils.batchDeleteNotes(mContentResolver, ids); + } else { + // in sync mode, we'll move the deleted folder into the trash folder + DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER); + } + if (widgets != null) { + for (AppWidgetAttribute widget : widgets) { + if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { + updateWidget(widget.widgetId, widget.widgetType); + } + } + } + } + + private void openNode(NoteItemData data) { + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, data.getId()); + this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); + } + + private void openFolder(NoteItemData data) { + mCurrentFolderId = data.getId(); + startAsyncNotesListQuery(); + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mState = ListEditState.CALL_RECORD_FOLDER; + mAddNewNote.setVisibility(View.GONE); + } else { + mState = ListEditState.SUB_FOLDER; + } + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mTitleBar.setText(R.string.call_record_folder_name); + } else { + mTitleBar.setText(data.getSnippet()); + } + mTitleBar.setVisibility(View.VISIBLE); + } + + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_new_note: + createNewNote(); + break; + default: + break; + } + } + + private void showSoftInput() { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + } + } + + private void hideSoftInput(View view) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + private void showCreateOrModifyFolderDialog(final boolean create) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); + final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); + showSoftInput(); + if (!create) { + if (mFocusNoteDataItem != null) { + etName.setText(mFocusNoteDataItem.getSnippet()); + builder.setTitle(getString(R.string.menu_folder_change_name)); + } else { + Log.e(TAG, "The long click data item is null"); + return; + } + } else { + etName.setText(""); + builder.setTitle(this.getString(R.string.menu_create_folder)); + } + + builder.setPositiveButton(android.R.string.ok, null); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + hideSoftInput(etName); + } + }); + + final Dialog dialog = builder.setView(view).show(); + final Button positive = (Button)dialog.findViewById(android.R.id.button1); + positive.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + hideSoftInput(etName); + String name = etName.getText().toString(); + if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { + Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), + Toast.LENGTH_LONG).show(); + etName.setSelection(0, etName.length()); + return; + } + if (!create) { + if (!TextUtils.isEmpty(name)) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.SNIPPET, name); + values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID + + "=?", new String[] { + String.valueOf(mFocusNoteDataItem.getId()) + }); + } + } else if (!TextUtils.isEmpty(name)) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.SNIPPET, name); + values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); + } + dialog.dismiss(); + } + }); + + if (TextUtils.isEmpty(etName.getText())) { + positive.setEnabled(false); + } + /** + * When the name edit text is null, disable the positive button + */ + etName.addTextChangedListener(new TextWatcher() { + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // TODO Auto-generated method stub + + } + + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (TextUtils.isEmpty(etName.getText())) { + positive.setEnabled(false); + } else { + positive.setEnabled(true); + } + } + + public void afterTextChanged(Editable s) { + // TODO Auto-generated method stub + + } + }); + } + + @Override + public void onBackPressed() { + switch (mState) { + case SUB_FOLDER: + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + startAsyncNotesListQuery(); + mTitleBar.setVisibility(View.GONE); + break; + case CALL_RECORD_FOLDER: + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + mAddNewNote.setVisibility(View.VISIBLE); + mTitleBar.setVisibility(View.GONE); + startAsyncNotesListQuery(); + break; + case NOTE_LIST: + super.onBackPressed(); + break; + default: + break; + } + } + + private void updateWidget(int appWidgetId, int appWidgetType) { + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + if (appWidgetType == Notes.TYPE_WIDGET_2X) { + intent.setClass(this, NoteWidgetProvider_2x.class); + } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { + intent.setClass(this, NoteWidgetProvider_4x.class); + } else { + Log.e(TAG, "Unspported widget type"); + return; + } + + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { + appWidgetId + }); + + sendBroadcast(intent); + setResult(RESULT_OK, intent); + } + + private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + if (mFocusNoteDataItem != null) { + menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); + menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view); + menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete); + menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name); + } + } + }; + + @Override + public void onContextMenuClosed(Menu menu) { + if (mNotesListView != null) { + mNotesListView.setOnCreateContextMenuListener(null); + } + super.onContextMenuClosed(menu); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + if (mFocusNoteDataItem == null) { + Log.e(TAG, "The long click data item is null"); + return false; + } + switch (item.getItemId()) { + case MENU_FOLDER_VIEW: + openFolder(mFocusNoteDataItem); + break; + case MENU_FOLDER_DELETE: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_folder)); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteFolder(mFocusNoteDataItem.getId()); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case MENU_FOLDER_CHANGE_NAME: + showCreateOrModifyFolderDialog(false); + break; + default: + break; + } + + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.clear(); + if (mState == ListEditState.NOTE_LIST) { + getMenuInflater().inflate(R.menu.note_list, menu); + // set sync or sync_cancel + menu.findItem(R.id.menu_sync).setTitle( + GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync); + } else if (mState == ListEditState.SUB_FOLDER) { + getMenuInflater().inflate(R.menu.sub_folder, menu); + } else if (mState == ListEditState.CALL_RECORD_FOLDER) { + getMenuInflater().inflate(R.menu.call_record_folder, menu); + } else { + Log.e(TAG, "Wrong state:" + mState); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_new_folder: { + showCreateOrModifyFolderDialog(true); + break; + } + case R.id.menu_export_text: { + exportNoteToText(); + break; + } + case R.id.menu_sync: { + if (isSyncMode()) { + if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { + GTaskSyncService.startSync(this); + } else { + GTaskSyncService.cancelSync(this); + } + } else { + startPreferenceActivity(); + } + break; + } + case R.id.menu_setting: { + startPreferenceActivity(); + break; + } + case R.id.menu_new_note: { + createNewNote(); + break; + } + case R.id.menu_search: + onSearchRequested(); + break; + default: + break; + } + return true; + } + + @Override + public boolean onSearchRequested() { + startSearch(null, false, null /* appData */, false); + return true; + } + + private void exportNoteToText() { + final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); + new AsyncTask() { + + @Override + protected Integer doInBackground(Void... unused) { + return backup.exportToText(); + } + + @Override + protected void onPostExecute(Integer result) { + if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.failed_sdcard_export)); + builder.setMessage(NotesListActivity.this + .getString(R.string.error_sdcard_unmounted)); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } else if (result == BackupUtils.STATE_SUCCESS) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.success_sdcard_export)); + builder.setMessage(NotesListActivity.this.getString( + R.string.format_exported_file_location, backup + .getExportedTextFileName(), backup.getExportedTextFileDir())); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } else if (result == BackupUtils.STATE_SYSTEM_ERROR) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.failed_sdcard_export)); + builder.setMessage(NotesListActivity.this + .getString(R.string.error_sdcard_export)); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } + } + + }.execute(); + } + + private boolean isSyncMode() { + return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; + } + + private void startPreferenceActivity() { + Activity from = getParent() != null ? getParent() : this; + Intent intent = new Intent(from, NotesPreferenceActivity.class); + from.startActivityIfNeeded(intent, -1); + } + + private class OnListItemClickListener implements OnItemClickListener { + + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + NoteItemData item = ((NotesListItem) view).getItemData(); + if (mNotesListAdapter.isInChoiceMode()) { + if (item.getType() == Notes.TYPE_NOTE) { + position = position - mNotesListView.getHeaderViewsCount(); + mModeCallBack.onItemCheckedStateChanged(null, position, id, + !mNotesListAdapter.isSelectedItem(position)); + } + return; + } + + switch (mState) { + case NOTE_LIST: + if (item.getType() == Notes.TYPE_FOLDER + || item.getType() == Notes.TYPE_SYSTEM) { + openFolder(item); + } else if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in NOTE_LIST"); + } + break; + case SUB_FOLDER: + case CALL_RECORD_FOLDER: + if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in SUB_FOLDER"); + } + break; + default: + break; + } + } + } + + } + + private void startQueryDestinationFolders() { + String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; + selection = (mState == ListEditState.NOTE_LIST) ? selection: + "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; + + mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, + null, + Notes.CONTENT_NOTE_URI, + FoldersListAdapter.PROJECTION, + selection, + new String[] { + String.valueOf(Notes.TYPE_FOLDER), + String.valueOf(Notes.ID_TRASH_FOLER), + String.valueOf(mCurrentFolderId) + }, + NoteColumns.MODIFIED_DATE + " DESC"); + } + + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + mFocusNoteDataItem = ((NotesListItem) view).getItemData(); + if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { + if (mNotesListView.startActionMode(mModeCallBack) != null) { + mModeCallBack.onItemCheckedStateChanged(null, position, id, true); + mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } else { + Log.e(TAG, "startActionMode fails"); + } + } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { + mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); + } + } + return false; + } +} diff --git a/doc/notes/ui/NotesListAdapter.java b/doc/notes/ui/NotesListAdapter.java new file mode 100644 index 0000000..51c9cb9 --- /dev/null +++ b/doc/notes/ui/NotesListAdapter.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; + +import net.micode.notes.data.Notes; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + + +public class NotesListAdapter extends CursorAdapter { + private static final String TAG = "NotesListAdapter"; + private Context mContext; + private HashMap mSelectedIndex; + private int mNotesCount; + private boolean mChoiceMode; + + public static class AppWidgetAttribute { + public int widgetId; + public int widgetType; + }; + + public NotesListAdapter(Context context) { + super(context, null); + mSelectedIndex = new HashMap(); + mContext = context; + mNotesCount = 0; + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return new NotesListItem(context); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + if (view instanceof NotesListItem) { + NoteItemData itemData = new NoteItemData(context, cursor); + ((NotesListItem) view).bind(context, itemData, mChoiceMode, + isSelectedItem(cursor.getPosition())); + } + } + + public void setCheckedItem(final int position, final boolean checked) { + mSelectedIndex.put(position, checked); + notifyDataSetChanged(); + } + + public boolean isInChoiceMode() { + return mChoiceMode; + } + + public void setChoiceMode(boolean mode) { + mSelectedIndex.clear(); + mChoiceMode = mode; + } + + public void selectAll(boolean checked) { + Cursor cursor = getCursor(); + for (int i = 0; i < getCount(); i++) { + if (cursor.moveToPosition(i)) { + if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { + setCheckedItem(i, checked); + } + } + } + } + + public HashSet getSelectedItemIds() { + HashSet itemSet = new HashSet(); + for (Integer position : mSelectedIndex.keySet()) { + if (mSelectedIndex.get(position) == true) { + Long id = getItemId(position); + if (id == Notes.ID_ROOT_FOLDER) { + Log.d(TAG, "Wrong item id, should not happen"); + } else { + itemSet.add(id); + } + } + } + + return itemSet; + } + + public HashSet getSelectedWidget() { + HashSet itemSet = new HashSet(); + for (Integer position : mSelectedIndex.keySet()) { + if (mSelectedIndex.get(position) == true) { + Cursor c = (Cursor) getItem(position); + if (c != null) { + AppWidgetAttribute widget = new AppWidgetAttribute(); + NoteItemData item = new NoteItemData(mContext, c); + widget.widgetId = item.getWidgetId(); + widget.widgetType = item.getWidgetType(); + itemSet.add(widget); + /** + * Don't close cursor here, only the adapter could close it + */ + } else { + Log.e(TAG, "Invalid cursor"); + return null; + } + } + } + return itemSet; + } + + public int getSelectedCount() { + Collection values = mSelectedIndex.values(); + if (null == values) { + return 0; + } + Iterator iter = values.iterator(); + int count = 0; + while (iter.hasNext()) { + if (true == iter.next()) { + count++; + } + } + return count; + } + + public boolean isAllSelected() { + int checkedCount = getSelectedCount(); + return (checkedCount != 0 && checkedCount == mNotesCount); + } + + public boolean isSelectedItem(final int position) { + if (null == mSelectedIndex.get(position)) { + return false; + } + return mSelectedIndex.get(position); + } + + @Override + protected void onContentChanged() { + super.onContentChanged(); + calcNotesCount(); + } + + @Override + public void changeCursor(Cursor cursor) { + super.changeCursor(cursor); + calcNotesCount(); + } + + private void calcNotesCount() { + mNotesCount = 0; + for (int i = 0; i < getCount(); i++) { + Cursor c = (Cursor) getItem(i); + if (c != null) { + if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { + mNotesCount++; + } + } else { + Log.e(TAG, "Invalid cursor"); + return; + } + } + } +} diff --git a/doc/notes/ui/NotesListItem.java b/doc/notes/ui/NotesListItem.java new file mode 100644 index 0000000..1221e80 --- /dev/null +++ b/doc/notes/ui/NotesListItem.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.text.format.DateUtils; +import android.view.View; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser.NoteItemBgResources; + + +public class NotesListItem extends LinearLayout { + private ImageView mAlert; + private TextView mTitle; + private TextView mTime; + private TextView mCallName; + private NoteItemData mItemData; + private CheckBox mCheckBox; + + public NotesListItem(Context context) { + super(context); + inflate(context, R.layout.note_item, this); + mAlert = (ImageView) findViewById(R.id.iv_alert_icon); + mTitle = (TextView) findViewById(R.id.tv_title); + mTime = (TextView) findViewById(R.id.tv_time); + mCallName = (TextView) findViewById(R.id.tv_name); + mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); + } + + public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { + if (choiceMode && data.getType() == Notes.TYPE_NOTE) { + mCheckBox.setVisibility(View.VISIBLE); + mCheckBox.setChecked(checked); + } else { + mCheckBox.setVisibility(View.GONE); + } + + mItemData = data; + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mCallName.setVisibility(View.GONE); + mAlert.setVisibility(View.VISIBLE); + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + mTitle.setText(context.getString(R.string.call_record_folder_name) + + context.getString(R.string.format_folder_files_count, data.getNotesCount())); + mAlert.setImageResource(R.drawable.call_record); + } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { + mCallName.setVisibility(View.VISIBLE); + mCallName.setText(data.getCallName()); + mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + if (data.hasAlert()) { + mAlert.setImageResource(R.drawable.clock); + mAlert.setVisibility(View.VISIBLE); + } else { + mAlert.setVisibility(View.GONE); + } + } else { + mCallName.setVisibility(View.GONE); + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + + if (data.getType() == Notes.TYPE_FOLDER) { + mTitle.setText(data.getSnippet() + + context.getString(R.string.format_folder_files_count, + data.getNotesCount())); + mAlert.setVisibility(View.GONE); + } else { + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + if (data.hasAlert()) { + mAlert.setImageResource(R.drawable.clock); + mAlert.setVisibility(View.VISIBLE); + } else { + mAlert.setVisibility(View.GONE); + } + } + } + mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + + setBackground(data); + } + + private void setBackground(NoteItemData data) { + int id = data.getBgColorId(); + if (data.getType() == Notes.TYPE_NOTE) { + if (data.isSingle() || data.isOneFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); + } else if (data.isLast()) { + setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); + } else if (data.isFirst() || data.isMultiFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); + } else { + setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); + } + } else { + setBackgroundResource(NoteItemBgResources.getFolderBgRes()); + } + } + + public NoteItemData getItemData() { + return mItemData; + } +} diff --git a/doc/notes/ui/NotesPreferenceActivity.java b/doc/notes/ui/NotesPreferenceActivity.java new file mode 100644 index 0000000..07c5f7e --- /dev/null +++ b/doc/notes/ui/NotesPreferenceActivity.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.app.ActionBar; +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.remote.GTaskSyncService; + + +public class NotesPreferenceActivity extends PreferenceActivity { + public static final String PREFERENCE_NAME = "notes_preferences"; + + public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; + + public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; + + public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; + + private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; + + private static final String AUTHORITIES_FILTER_KEY = "authorities"; + + private PreferenceCategory mAccountCategory; + + private GTaskReceiver mReceiver; + + private Account[] mOriAccounts; + + private boolean mHasAddedAccount; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + + /* using the app icon for navigation */ + getActionBar().setDisplayHomeAsUpEnabled(true); + + addPreferencesFromResource(R.xml.preferences); + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); + mReceiver = new GTaskReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); + registerReceiver(mReceiver, filter); + + mOriAccounts = null; + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); + getListView().addHeaderView(header, null, true); + } + + @Override + protected void onResume() { + super.onResume(); + + // need to set sync account automatically if user has added a new + // account + if (mHasAddedAccount) { + Account[] accounts = getGoogleAccounts(); + if (mOriAccounts != null && accounts.length > mOriAccounts.length) { + for (Account accountNew : accounts) { + boolean found = false; + for (Account accountOld : mOriAccounts) { + if (TextUtils.equals(accountOld.name, accountNew.name)) { + found = true; + break; + } + } + if (!found) { + setSyncAccount(accountNew.name); + break; + } + } + } + } + + refreshUI(); + } + + @Override + protected void onDestroy() { + if (mReceiver != null) { + unregisterReceiver(mReceiver); + } + super.onDestroy(); + } + + private void loadAccountPreference() { + mAccountCategory.removeAll(); + + Preference accountPref = new Preference(this); + final String defaultAccount = getSyncAccountName(this); + accountPref.setTitle(getString(R.string.preferences_account_title)); + accountPref.setSummary(getString(R.string.preferences_account_summary)); + accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + if (!GTaskSyncService.isSyncing()) { + if (TextUtils.isEmpty(defaultAccount)) { + // the first time to set account + showSelectAccountAlertDialog(); + } else { + // if the account has already been set, we need to promp + // user about the risk + showChangeAccountConfirmAlertDialog(); + } + } else { + Toast.makeText(NotesPreferenceActivity.this, + R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) + .show(); + } + return true; + } + }); + + mAccountCategory.addPreference(accountPref); + } + + private void loadSyncButton() { + Button syncButton = (Button) findViewById(R.id.preference_sync_button); + TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); + + // set button state + if (GTaskSyncService.isSyncing()) { + syncButton.setText(getString(R.string.preferences_button_sync_cancel)); + syncButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + GTaskSyncService.cancelSync(NotesPreferenceActivity.this); + } + }); + } else { + syncButton.setText(getString(R.string.preferences_button_sync_immediately)); + syncButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + GTaskSyncService.startSync(NotesPreferenceActivity.this); + } + }); + } + syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); + + // set last sync time + if (GTaskSyncService.isSyncing()) { + lastSyncTimeView.setText(GTaskSyncService.getProgressString()); + lastSyncTimeView.setVisibility(View.VISIBLE); + } else { + long lastSyncTime = getLastSyncTime(this); + if (lastSyncTime != 0) { + lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, + DateFormat.format(getString(R.string.preferences_last_sync_time_format), + lastSyncTime))); + lastSyncTimeView.setVisibility(View.VISIBLE); + } else { + lastSyncTimeView.setVisibility(View.GONE); + } + } + } + + private void refreshUI() { + loadAccountPreference(); + loadSyncButton(); + } + + private void showSelectAccountAlertDialog() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + + View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); + TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); + titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); + + dialogBuilder.setCustomTitle(titleView); + dialogBuilder.setPositiveButton(null, null); + + Account[] accounts = getGoogleAccounts(); + String defAccount = getSyncAccountName(this); + + mOriAccounts = accounts; + mHasAddedAccount = false; + + if (accounts.length > 0) { + CharSequence[] items = new CharSequence[accounts.length]; + final CharSequence[] itemMapping = items; + int checkedItem = -1; + int index = 0; + for (Account account : accounts) { + if (TextUtils.equals(account.name, defAccount)) { + checkedItem = index; + } + items[index++] = account.name; + } + dialogBuilder.setSingleChoiceItems(items, checkedItem, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + setSyncAccount(itemMapping[which].toString()); + dialog.dismiss(); + refreshUI(); + } + }); + } + + View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); + dialogBuilder.setView(addAccountView); + + final AlertDialog dialog = dialogBuilder.show(); + addAccountView.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + mHasAddedAccount = true; + Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); + intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { + "gmail-ls" + }); + startActivityForResult(intent, -1); + dialog.dismiss(); + } + }); + } + + private void showChangeAccountConfirmAlertDialog() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + + View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); + TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); + titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, + getSyncAccountName(this))); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); + dialogBuilder.setCustomTitle(titleView); + + CharSequence[] menuItemArray = new CharSequence[] { + getString(R.string.preferences_menu_change_account), + getString(R.string.preferences_menu_remove_account), + getString(R.string.preferences_menu_cancel) + }; + dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (which == 0) { + showSelectAccountAlertDialog(); + } else if (which == 1) { + removeSyncAccount(); + refreshUI(); + } + } + }); + dialogBuilder.show(); + } + + private Account[] getGoogleAccounts() { + AccountManager accountManager = AccountManager.get(this); + return accountManager.getAccountsByType("com.google"); + } + + private void setSyncAccount(String account) { + if (!getSyncAccountName(this).equals(account)) { + SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + if (account != null) { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); + } else { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + editor.commit(); + + // clean up last sync time + setLastSyncTime(this, 0); + + // clean up local gtask related info + new Thread(new Runnable() { + public void run() { + ContentValues values = new ContentValues(); + values.put(NoteColumns.GTASK_ID, ""); + values.put(NoteColumns.SYNC_ID, 0); + getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); + } + }).start(); + + Toast.makeText(NotesPreferenceActivity.this, + getString(R.string.preferences_toast_success_set_accout, account), + Toast.LENGTH_SHORT).show(); + } + } + + private void removeSyncAccount() { + SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { + editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); + } + if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { + editor.remove(PREFERENCE_LAST_SYNC_TIME); + } + editor.commit(); + + // clean up local gtask related info + new Thread(new Runnable() { + public void run() { + ContentValues values = new ContentValues(); + values.put(NoteColumns.GTASK_ID, ""); + values.put(NoteColumns.SYNC_ID, 0); + getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); + } + }).start(); + } + + public static String getSyncAccountName(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + + public static void setLastSyncTime(Context context, long time) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); + editor.commit(); + } + + public static long getLastSyncTime(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); + } + + private class GTaskReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + refreshUI(); + if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { + TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); + syncStatus.setText(intent + .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); + } + + } + } + + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + Intent intent = new Intent(this, NotesListActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + return true; + default: + return false; + } + } +} diff --git a/doc/notes/widget/NoteWidgetProvider.java b/doc/notes/widget/NoteWidgetProvider.java new file mode 100644 index 0000000..ec6f819 --- /dev/null +++ b/doc/notes/widget/NoteWidgetProvider.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.util.Log; +import android.widget.RemoteViews; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.ui.NoteEditActivity; +import net.micode.notes.ui.NotesListActivity; + +public abstract class NoteWidgetProvider extends AppWidgetProvider { + public static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.BG_COLOR_ID, + NoteColumns.SNIPPET + }; + + public static final int COLUMN_ID = 0; + public static final int COLUMN_BG_COLOR_ID = 1; + public static final int COLUMN_SNIPPET = 2; + + private static final String TAG = "NoteWidgetProvider"; + + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + for (int i = 0; i < appWidgetIds.length; i++) { + context.getContentResolver().update(Notes.CONTENT_NOTE_URI, + values, + NoteColumns.WIDGET_ID + "=?", + new String[] { String.valueOf(appWidgetIds[i])}); + } + } + + private Cursor getNoteWidgetInfo(Context context, int widgetId) { + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, + null); + } + + protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + update(context, appWidgetManager, appWidgetIds, false); + } + + private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, + boolean privacyMode) { + for (int i = 0; i < appWidgetIds.length; i++) { + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + int bgId = ResourceParser.getDefaultBgId(context); + String snippet = ""; + Intent intent = new Intent(context, NoteEditActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); + + Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); + if (c != null && c.moveToFirst()) { + if (c.getCount() > 1) { + Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); + c.close(); + return; + } + snippet = c.getString(COLUMN_SNIPPET); + bgId = c.getInt(COLUMN_BG_COLOR_ID); + intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); + intent.setAction(Intent.ACTION_VIEW); + } else { + snippet = context.getResources().getString(R.string.widget_havenot_content); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + } + + if (c != null) { + c.close(); + } + + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + /** + * Generate the pending intent to start host for the widget + */ + PendingIntent pendingIntent = null; + if (privacyMode) { + rv.setTextViewText(R.id.widget_text, + context.getString(R.string.widget_under_visit_mode)); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( + context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + } else { + rv.setTextViewText(R.id.widget_text, snippet); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, + PendingIntent.FLAG_UPDATE_CURRENT); + } + + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + } + } + + protected abstract int getBgResourceId(int bgId); + + protected abstract int getLayoutId(); + + protected abstract int getWidgetType(); +} diff --git a/doc/notes/widget/NoteWidgetProvider_2x.java b/doc/notes/widget/NoteWidgetProvider_2x.java new file mode 100644 index 0000000..adcb2f7 --- /dev/null +++ b/doc/notes/widget/NoteWidgetProvider_2x.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + + +public class NoteWidgetProvider_2x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + @Override + protected int getLayoutId() { + return R.layout.widget_2x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_2X; + } +} diff --git a/doc/notes/widget/NoteWidgetProvider_4x.java b/doc/notes/widget/NoteWidgetProvider_4x.java new file mode 100644 index 0000000..c12a02e --- /dev/null +++ b/doc/notes/widget/NoteWidgetProvider_4x.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + + +public class NoteWidgetProvider_4x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + protected int getLayoutId() { + return R.layout.widget_4x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_4X; + } +} diff --git a/doc/test.txt b/doc/test.txt deleted file mode 100644 index e69de29..0000000 -- 2.34.1 From 5d5ed25f6a36aec864cb65c7352e33992faa7d85 Mon Sep 17 00:00:00 2001 From: zhangyi <3232645369@qq.com> Date: Tue, 17 Dec 2024 22:36:58 +0800 Subject: [PATCH 4/6] a --- README.md | 2 - doc/notes/MainActivity.java | 24 - doc/notes/data/Contact.java | 86 -- doc/notes/data/Notes.java | 169 ---- doc/notes/data/NotesDatabaseHelper.java | 210 ---- doc/notes/data/NotesProvider.java | 357 ------- doc/notes/gtask/data/MetaData.java | 89 -- doc/notes/gtask/data/Node.java | 116 --- doc/notes/gtask/data/SqlData.java | 189 ---- doc/notes/gtask/data/SqlNote.java | 505 --------- doc/notes/gtask/data/Task.java | 351 ------- doc/notes/gtask/data/TaskList.java | 343 ------- .../exception/ActionFailureException.java | 33 - .../exception/NetworkFailureException.java | 33 - doc/notes/gtask/remote/GTaskASyncTask.java | 124 --- doc/notes/gtask/remote/GTaskClient.java | 585 ----------- doc/notes/gtask/remote/GTaskManager.java | 800 --------------- doc/notes/gtask/remote/GTaskSyncService.java | 128 --- doc/notes/model/Note.java | 253 ----- doc/notes/model/WorkingNote.java | 368 ------- doc/notes/tool/BackupUtils.java | 344 ------- doc/notes/tool/DataUtils.java | 295 ------ doc/notes/tool/GTaskStringUtils.java | 113 --- doc/notes/tool/ResourceParser.java | 181 ---- doc/notes/ui/AlarmAlertActivity.java | 158 --- doc/notes/ui/AlarmInitReceiver.java | 65 -- doc/notes/ui/AlarmReceiver.java | 30 - doc/notes/ui/DateTimePicker.java | 485 --------- doc/notes/ui/DateTimePickerDialog.java | 90 -- doc/notes/ui/DropdownMenu.java | 61 -- doc/notes/ui/FoldersListAdapter.java | 80 -- doc/notes/ui/NoteEditActivity.java | 873 ---------------- doc/notes/ui/NoteEditText.java | 217 ---- doc/notes/ui/NoteItemData.java | 224 ---- doc/notes/ui/NotesListActivity.java | 954 ------------------ doc/notes/ui/NotesListAdapter.java | 184 ---- doc/notes/ui/NotesListItem.java | 122 --- doc/notes/ui/NotesPreferenceActivity.java | 388 ------- doc/notes/widget/NoteWidgetProvider.java | 132 --- doc/notes/widget/NoteWidgetProvider_2x.java | 47 - doc/notes/widget/NoteWidgetProvider_4x.java | 46 - doc/小米便签成功截图.png | Bin 408936 -> 0 bytes 42 files changed, 9854 deletions(-) delete mode 100644 README.md delete mode 100644 doc/notes/MainActivity.java delete mode 100644 doc/notes/data/Contact.java delete mode 100644 doc/notes/data/Notes.java delete mode 100644 doc/notes/data/NotesDatabaseHelper.java delete mode 100644 doc/notes/data/NotesProvider.java delete mode 100644 doc/notes/gtask/data/MetaData.java delete mode 100644 doc/notes/gtask/data/Node.java delete mode 100644 doc/notes/gtask/data/SqlData.java delete mode 100644 doc/notes/gtask/data/SqlNote.java delete mode 100644 doc/notes/gtask/data/Task.java delete mode 100644 doc/notes/gtask/data/TaskList.java delete mode 100644 doc/notes/gtask/exception/ActionFailureException.java delete mode 100644 doc/notes/gtask/exception/NetworkFailureException.java delete mode 100644 doc/notes/gtask/remote/GTaskASyncTask.java delete mode 100644 doc/notes/gtask/remote/GTaskClient.java delete mode 100644 doc/notes/gtask/remote/GTaskManager.java delete mode 100644 doc/notes/gtask/remote/GTaskSyncService.java delete mode 100644 doc/notes/model/Note.java delete mode 100644 doc/notes/model/WorkingNote.java delete mode 100644 doc/notes/tool/BackupUtils.java delete mode 100644 doc/notes/tool/DataUtils.java delete mode 100644 doc/notes/tool/GTaskStringUtils.java delete mode 100644 doc/notes/tool/ResourceParser.java delete mode 100644 doc/notes/ui/AlarmAlertActivity.java delete mode 100644 doc/notes/ui/AlarmInitReceiver.java delete mode 100644 doc/notes/ui/AlarmReceiver.java delete mode 100644 doc/notes/ui/DateTimePicker.java delete mode 100644 doc/notes/ui/DateTimePickerDialog.java delete mode 100644 doc/notes/ui/DropdownMenu.java delete mode 100644 doc/notes/ui/FoldersListAdapter.java delete mode 100644 doc/notes/ui/NoteEditActivity.java delete mode 100644 doc/notes/ui/NoteEditText.java delete mode 100644 doc/notes/ui/NoteItemData.java delete mode 100644 doc/notes/ui/NotesListActivity.java delete mode 100644 doc/notes/ui/NotesListAdapter.java delete mode 100644 doc/notes/ui/NotesListItem.java delete mode 100644 doc/notes/ui/NotesPreferenceActivity.java delete mode 100644 doc/notes/widget/NoteWidgetProvider.java delete mode 100644 doc/notes/widget/NoteWidgetProvider_2x.java delete mode 100644 doc/notes/widget/NoteWidgetProvider_4x.java delete mode 100644 doc/小米便签成功截图.png diff --git a/README.md b/README.md deleted file mode 100644 index 3f3813b..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# xaiomi_zy - diff --git a/doc/notes/MainActivity.java b/doc/notes/MainActivity.java deleted file mode 100644 index 8091753..0000000 --- a/doc/notes/MainActivity.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.micode.notes; - -import android.os.Bundle; - -import androidx.activity.EdgeToEdge; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - EdgeToEdge.enable(this); - setContentView(R.layout.activity_main); - ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { - Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); - v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); - return insets; - }); - } -} \ No newline at end of file diff --git a/doc/notes/data/Contact.java b/doc/notes/data/Contact.java deleted file mode 100644 index b658581..0000000 --- a/doc/notes/data/Contact.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - -import android.content.Context; -import android.database.Cursor; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.Data; -import android.telephony.PhoneNumberUtils; -import android.util.Log; - -import java.util.HashMap; - -// Contact类用于获取与电话号码关联的联系人姓名 -public class Contact { - // 缓存已查询的电话号码和对应的联系人姓名 - private static HashMap sContactCache; - // 日志标签,用于调试和错误日志 - private static final String TAG = "Contact"; - - // 用于查询联系人的SQL选择语句,其中"+"将被替换为电话号码的最小匹配值 - private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER - + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Data.RAW_CONTACT_ID + " IN " - + "(SELECT raw_contact_id " - + " FROM phone_lookup" - + " WHERE min_match = '+')"; - - // 根据电话号码获取联系人姓名的方法 - public static String getContact(Context context, String phoneNumber) { - // 如果缓存为空,则初始化缓存 - if(sContactCache == null) { - sContactCache = new HashMap(); - } - - // 如果缓存中已存在该电话号码对应的联系人姓名,则直接返回 - if(sContactCache.containsKey(phoneNumber)) { - return sContactCache.get(phoneNumber); - } - - // 替换SQL选择语句中的"+"为电话号码的最小匹配值 - String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); - // 查询联系人数据 - Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, // 查询联系人姓名 - selection, - new String[] { phoneNumber }, // 查询条件为电话号码 - null); - - // 如果查询结果不为空且能够移动到第一条记录,则获取联系人姓名 - if (cursor != null && cursor.moveToFirst()) { - try { - String name = cursor.getString(0); // 获取联系人姓名 - sContactCache.put(phoneNumber, name); // 将结果存入缓存 - return name; - } catch (IndexOutOfBoundsException e) { - // 如果发生异常,记录错误日志并返回null - Log.e(TAG, " Cursor get string error " + e.toString()); - return null; - } finally { - cursor.close(); // 关闭游标释放资源 - } - } else { - // 如果没有找到匹配的联系人,记录调试信息并返回null - Log.d(TAG, "No contact matched with number:" + phoneNumber); - return null; - } - } -} - diff --git a/doc/notes/data/Notes.java b/doc/notes/data/Notes.java deleted file mode 100644 index 53ca199..0000000 --- a/doc/notes/data/Notes.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - -import android.net.Uri; - -// Notes类,用于定义笔记应用中的常量和接口 -public class Notes { - // 内容提供者的Authority - public static final String AUTHORITY = "micode_notes"; - // 日志标签 - public static final String TAG = "Notes"; - - // 笔记类型常量 - public static final int TYPE_NOTE = 0; // 普通笔记 - public static final int TYPE_FOLDER = 1; // 文件夹 - public static final int TYPE_SYSTEM = 2; // 系统文件夹 - - // 系统文件夹ID常量 - public static final int ID_ROOT_FOLDER = 0; // 根文件夹 - public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹,用于存放不属于任何文件夹的笔记 - public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹 - public static final int ID_TRASH_FOLER = -3; // 垃圾箱文件夹 - - // Intent额外的键 - public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; // 提醒日期 - public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; // 背景颜色ID - public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; // 小部件ID - public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; // 小部件类型 - public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; // 文件夹ID - public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; // 通话日期 - - // 小部件类型常量 - public static final int TYPE_WIDGET_INVALIDE = -1; // 无效小部件 - public static final int TYPE_WIDGET_2X = 0; // 2x小部件 - public static final int TYPE_WIDGET_4X = 1; // 4x小部件 - - // 数据常量类 - public static class DataConstants { - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 文本笔记 - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话记录笔记 - } - - // 查询所有笔记和文件夹的Uri - public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); - - // 查询数据的Uri - public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); - - // 笔记列接口 - public interface NoteColumns { - // 唯一ID - public static final String ID = "_id"; - - // 父级ID - public static final String PARENT_ID = "parent_id"; - - // 创建日期 - public static final String CREATED_DATE = "created_date"; - - // 最后修改日期 - public static final String MODIFIED_DATE = "modified_date"; - - // 提醒日期 - public static final String ALERTED_DATE = "alert_date"; - - // 文件夹名称或笔记文本内容 - public static final String SNIPPET = "snippet"; - - // 笔记小部件ID - public static final String WIDGET_ID = "widget_id"; - - // 笔记小部件类型 - public static final String WIDGET_TYPE = "widget_type"; - - // 笔记背景颜色ID - public static final String BG_COLOR_ID = "bg_color_id"; - - // 笔记是否有附件 - public static final String HAS_ATTACHMENT = "has_attachment"; - - // 文件夹中的笔记数量 - public static final String NOTES_COUNT = "notes_count"; - - // 文件类型:文件夹或笔记 - public static final String TYPE = "type"; - - // 最后同步ID - public static final String SYNC_ID = "sync_id"; - - // 本地修改标志 - public static final String LOCAL_MODIFIED = "local_modified"; - - // 移动到临时文件夹前的原始父ID列 - public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - // GTask ID列 - public static final String GTASK_ID = "gtask_id"; - // 版本号列 - public static final String VERSION = "version"; - } - - // 数据列接口,定义了数据表的列名和类型 - public interface DataColumns { - // 唯一ID列 - public static final String ID = "_id"; - // MIME类型列 - public static final String MIME_TYPE = "mime_type"; - // 笔记ID列 - public static final String NOTE_ID = "note_id"; - // 创建日期列 - public static final String CREATED_DATE = "created_date"; - // 最后修改日期列 - public static final String MODIFIED_DATE = "modified_date"; - // 数据的内容 - public static final String CONTENT = "content"; - // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 - public static final String DATA1 = "data1"; - // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 - public static final String DATA2 = "data2"; - // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 - public static final String DATA3 = "data3"; - // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 - public static final String DATA4 = "data4"; - // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 - public static final String DATA5 = "data5"; - } - - // TextNote类实现了DataColumns接口,定义了文本笔记的相关常量 - public static final class TextNote implements DataColumns { - // 模式,用于指示文本是否处于复选框列表模式 - public static final String MODE = DATA1; - // 复选框列表模式常量 - public static final int MODE_CHECK_LIST = 1; - // 内容类型常量,用于目录 - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - // 内容项类型常量,用于单个项目 - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - // 内容URI,用于访问文本笔记的数据 - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); - } - - // CallNote类实现了DataColumns接口,定义了通话笔记的相关常量 - public static final class CallNote implements DataColumns { - // 通话日期列 - public static final String CALL_DATE = DATA1; - // 电话号码列 - public static final String PHONE_NUMBER = DATA3; - // 内容类型常量,用于目录 - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - // 内容项类型常量,用于单个项目 - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - // 内容URI,用于访问通话笔记的数据 - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); - } -} diff --git a/doc/notes/data/NotesDatabaseHelper.java b/doc/notes/data/NotesDatabaseHelper.java deleted file mode 100644 index d380033..0000000 --- a/doc/notes/data/NotesDatabaseHelper.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - -import android.content.ContentValues; -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - - -// NotesDatabaseHelper类扩展了SQLiteOpenHelper,用于管理数据库的创建和版本管理 -public class NotesDatabaseHelper extends SQLiteOpenHelper { - // 数据库文件名 - private static final String DB_NAME = "note.db"; - // 数据库版本号 - private static final int DB_VERSION = 4; - - // TABLE接口定义了数据库中的表名常量 - public interface TABLE { - public static final String NOTE = "note"; // 笔记表 - public static final String DATA = "data"; // 数据表 - } - - // 日志标签,用于调试和错误日志 - private static final String TAG = "NotesDatabaseHelper"; - - // 单例模式的数据库助手实例 - private static NotesDatabaseHelper mInstance; - - // 创建笔记表的SQL语句 - private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(...)"; - // 创建数据表的SQL语句 - private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(...)"; - // 创建数据表上笔记ID索引的SQL语句 - private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(...);"; - - // 定义了多个触发器,用于在笔记表和数据表上的操作后自动更新相关数据 - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update ..."; - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update ..."; - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert ..."; - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete ..."; - private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert ..."; - private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update ..."; - private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete ..."; - private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete ..."; - private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete ..."; - private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash ..."; - - // 构造函数,初始化数据库助手 - public NotesDatabaseHelper(Context context) { - super(context, DB_NAME, null, DB_VERSION); - } - - // 创建笔记表及其触发器 - public void createNoteTable(SQLiteDatabase db) { - db.execSQL(CREATE_NOTE_TABLE_SQL); - reCreateNoteTableTriggers(db); - createSystemFolder(db); - Log.d(TAG, "note table has been created"); - } - - // 重新创建笔记表的触发器 - private void reCreateNoteTableTriggers(SQLiteDatabase db) { - // 删除旧的触发器 - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); - // ... 其他触发器删除代码 ... - // 创建新的触发器 - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - // ... 其他触发器创建代码 ... - } - - // 创建系统文件夹 - private void createSystemFolder(SQLiteDatabase db) { - ContentValues values = new ContentValues(); - // 创建通话记录文件夹 - values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); - // ... 其他系统文件夹创建代码 ... - } - - // 创建数据表及其触发器 - public void createDataTable(SQLiteDatabase db) { - db.execSQL(CREATE_DATA_TABLE_SQL); - reCreateDataTableTriggers(db); - db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); - Log.d(TAG, "data table has been created"); - } - - // 重新创建数据表的触发器,删除旧的触发器并创建新的触发器 - private void reCreateDataTableTriggers(SQLiteDatabase db) { - // 删除如果存在的话,插入数据时更新笔记内容的触发器 - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); - // 删除如果存在的话,更新数据时更新笔记内容的触发器 - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); - // 删除如果存在的话,删除数据时更新笔记内容的触发器 - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); - - // 创建新的触发器,用于在插入数据时更新笔记内容 - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); - // 创建新的触发器,用于在更新数据时更新笔记内容 - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); - // 创建新的触发器,用于在删除数据时更新笔记内容 - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); - } - - // 获取NotesDatabaseHelper的单例实例 - static synchronized NotesDatabaseHelper getInstance(Context context) { - // 如果单例实例为空,则创建一个新的实例 - if (mInstance == null) { - mInstance = new NotesDatabaseHelper(context); - } - // 返回单例实例 - return mInstance; - } - - // 当数据库被创建时调用此方法 - @Override - public void onCreate(SQLiteDatabase db) { - // 创建笔记表和数据表 - createNoteTable(db); - createDataTable(db); - } - - // 当数据库需要升级时调用此方法 - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - boolean reCreateTriggers = false; // 标记是否需要重新创建触发器 - boolean skipV2 = false; // 标记是否跳过版本2的升级 - - // 如果当前版本是1,则升级到版本2 - if (oldVersion == 1) { - upgradeToV2(db); - skipV2 = true; // 包含从版本2到版本3的升级 - oldVersion++; - } - - // 如果当前版本是2且没有跳过版本2的升级,则升级到版本3 - if (oldVersion == 2 && !skipV2) { - upgradeToV3(db); - reCreateTriggers = true; // 需要重新创建触发器 - oldVersion++; - } - - // 如果当前版本是3,则升级到版本4 - if (oldVersion == 3) { - upgradeToV4(db); - oldVersion++; - } - - // 如果需要重新创建触发器,则执行相关操作 - if (reCreateTriggers) { - reCreateNoteTableTriggers(db); - reCreateDataTableTriggers(db); - } - - // 如果版本号不匹配,抛出异常 - if (oldVersion != newVersion) { - throw new IllegalStateException("Upgrade notes database to version " + newVersion + " fails"); - } - } - - // 升级数据库到版本2 - private void upgradeToV2(SQLiteDatabase db) { - // 删除旧的笔记表和数据表 - db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); - // 创建新的笔记表和数据表 - createNoteTable(db); - createDataTable(db); - } - - // 升级数据库到版本3 - private void upgradeToV3(SQLiteDatabase db) { - // 删除不再使用的触发器 - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // 添加用于GTasks的ID列 - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''"); - // 添加垃圾文件夹 - ContentValues values = new ContentValues(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - } - - // 升级数据库到版本4 - private void upgradeToV4(SQLiteDatabase db) { - // 添加版本号列 - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); - } -} \ No newline at end of file diff --git a/doc/notes/data/NotesProvider.java b/doc/notes/data/NotesProvider.java deleted file mode 100644 index fe82f49..0000000 --- a/doc/notes/data/NotesProvider.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - - -import android.app.SearchManager; -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; - - -// NotesProvider类继承自ContentProvider,用于提供对笔记数据的访问 -public class NotesProvider extends ContentProvider { - private static final UriMatcher mMatcher; // 用于匹配Uri的UriMatcher - private NotesDatabaseHelper mHelper; // 数据库帮助类实例 - - private static final String TAG = "NotesProvider"; // 日志标签 - - // 定义Uri匹配的常量 - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; - private static final int URI_SEARCH = 5; - private static final int URI_SEARCH_SUGGEST = 6; - - static { - // 初始化UriMatcher并添加Uri匹配规则 - mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); - } - - // 定义用于搜索结果的投影,去除换行符并格式化输出 - private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," - + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," - + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," - + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," - + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; - - // 定义搜索查询的SQL语句 - private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION - + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" - + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER - + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - - // ContentProvider创建时调用 - @Override - public boolean onCreate() { - mHelper = NotesDatabaseHelper.getInstance(getContext()); // 获取数据库帮助类的实例 - return true; - } - - // 实现ContentProvider的query方法,用于查询数据 - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - Cursor c = null; // 初始化Cursor对象 - SQLiteDatabase db = mHelper.getReadableDatabase(); // 获取可读数据库实例 - String id = null; // 初始化ID变量,用于存储URI中的ID - - // 根据URI匹配结果执行不同的查询操作 - switch (mMatcher.match(uri)) { - case URI_NOTE: - // 如果URI匹配到笔记列表,查询笔记表 - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); - break; - case URI_NOTE_ITEM: - // 如果URI匹配到单个笔记,获取笔记ID并查询该笔记 - id = uri.getPathSegments().get(1); // 获取URI中的笔记ID - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + parseSelection(selection), - selectionArgs, null, null, sortOrder); - break; - case URI_DATA: - // 如果URI匹配到数据列表,查询数据表 - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); - break; - case URI_DATA_ITEM: - // 如果URI匹配到单个数据项,获取数据项ID并查询该数据项 - id = uri.getPathSegments().get(1); // 获取URI中的数据项ID - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), - selectionArgs, null, null, sortOrder); - break; - case URI_SEARCH: - case URI_SEARCH_SUGGEST: - // 如果URI匹配到搜索或搜索建议,执行搜索查询 - if (sortOrder != null || projection != null) { - // 如果提供了排序或投影参数,抛出异常,因为这些参数不应该用于搜索查询 - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection with this query"); - } - - // 获取搜索字符串 - String searchString = null; - if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { - // 如果是搜索建议,从URI中获取搜索字符串 - if (uri.getPathSegments().size() > 1) { - searchString = uri.getPathSegments().get(1); - } - } else { - // 如果是普通搜索,从URI的查询参数中获取搜索字符串 - searchString = uri.getQueryParameter("pattern"); - } - - // 如果搜索字符串为空,返回null - if (TextUtils.isEmpty(searchString)) { - return null; - } - - // 格式化搜索字符串并执行搜索查询 - try { - searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[]{searchString}); - } catch (IllegalStateException ex) { - // 如果发生异常,记录日志 - Log.e(TAG, "got exception: " + ex.toString()); - } - break; - default: - // 如果URI不匹配任何已知模式,抛出异常 - throw new IllegalArgumentException("Unknown URI " + uri); - } - - // 如果Cursor不为空,设置通知URI - if (c != null) { - c.setNotificationUri(getContext().getContentResolver(), uri); - } - return c; // 返回Cursor对象 - } - - // 实现ContentProvider的insert方法,用于插入数据 - @Override - public Uri insert(Uri uri, ContentValues values) { - SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 - long dataId = 0, noteId = 0, insertedId = 0; // 初始化ID变量 - - // 根据URI匹配结果执行不同的插入操作 - switch (mMatcher.match(uri)) { - case URI_NOTE: - // 如果URI匹配到笔记列表,插入新笔记 - insertedId = noteId = db.insert(TABLE.NOTE, null, values); // 插入笔记并获取新笔记的ID - break; - case URI_DATA: - // 如果URI匹配到数据列表,插入新数据 - if (values.containsKey(DataColumns.NOTE_ID)) { - // 如果ContentValues包含笔记ID,则获取该ID - noteId = values.getAsLong(DataColumns.NOTE_ID); - } else { - // 如果没有笔记ID,记录调试信息 - Log.d(TAG, "Wrong data format without note id:" + values.toString()); - } - insertedId = dataId = db.insert(TABLE.DATA, null, values); // 插入数据并获取新数据的ID - break; - default: - // 如果URI不匹配任何已知模式,抛出异常 - throw new IllegalArgumentException("Unknown URI " + uri); - } - - // 如果插入的是笔记,通知变更 - if (noteId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); - } - - // 如果插入的是数据,通知变更 - if (dataId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); - } - - // 返回插入数据的URI - return ContentUris.withAppendedId(uri, insertedId); - } - - // 实现ContentProvider的delete方法,用于删除数据 - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - int count = 0; // 初始化删除计数器 - String id = null; // 初始化ID变量 - SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 - boolean deleteData = false; // 标记是否删除数据 - - // 根据URI匹配结果执行不同的删除操作 - switch (mMatcher.match(uri)) { - case URI_NOTE: - // 如果URI匹配到笔记列表,删除笔记 - selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; // 确保只删除ID大于0的笔记 - count = db.delete(TABLE.NOTE, selection, selectionArgs); // 执行删除操作并获取删除计数 - break; - case URI_NOTE_ITEM: - // 如果URI匹配到单个笔记,获取笔记ID并删除该笔记 - id = uri.getPathSegments().get(1); // 获取URI中的笔记ID - long noteId = Long.valueOf(id); // 将ID转换为长整型 - if (noteId <= 0) { - // 如果ID小于等于0,表示系统文件夹,不允许删除,直接跳出 - break; - } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 - break; - case URI_DATA: - // 如果URI匹配到数据列表,删除数据 - count = db.delete(TABLE.DATA, selection, selectionArgs); // 执行删除操作并获取删除计数 - deleteData = true; // 设置删除数据标记 - break; - case URI_DATA_ITEM: - // 如果URI匹配到单个数据项,获取数据项ID并删除该数据项 - id = uri.getPathSegments().get(1); // 获取URI中的数据项ID - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 - deleteData = true; // 设置删除数据标记 - break; - default: - // 如果URI不匹配任何已知模式,抛出异常 - throw new IllegalArgumentException("Unknown URI " + uri); - } - - // 如果删除了数据,通知变更 - if (count > 0) { - if (deleteData) { - // 如果删除的是数据,通知笔记URI变更 - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - // 通知原始URI变更 - getContext().getContentResolver().notifyChange(uri, null); - } - - // 返回删除的记录数 - return count; - } - - // 实现ContentProvider的update方法,用于更新数据 - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int count = 0; // 初始化更新计数器 - String id = null; // 初始化ID变量 - SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 - boolean updateData = false; // 标记是否更新数据 - - // 根据URI匹配结果执行不同的更新操作 - switch (mMatcher.match(uri)) { - case URI_NOTE: - // 如果URI匹配到笔记列表,增加笔记版本号并更新笔记 - increaseNoteVersion(-1, selection, selectionArgs); // 增加笔记版本号 - count = db.update(TABLE.NOTE, values, selection, selectionArgs); // 执行更新操作并获取更新计数 - break; - case URI_NOTE_ITEM: - // 如果URI匹配到单个笔记,获取笔记ID,增加版本号并更新该笔记 - id = uri.getPathSegments().get(1); // 获取URI中的笔记ID - increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); // 增加笔记版本号 - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 - break; - case URI_DATA: - // 如果URI匹配到数据列表,更新数据 - count = db.update(TABLE.DATA, values, selection, selectionArgs); // 执行更新操作并获取更新计数 - updateData = true; // 设置更新数据标记 - break; - case URI_DATA_ITEM: - // 如果URI匹配到单个数据项,获取数据项ID并更新该数据项 - id = uri.getPathSegments().get(1); // 获取URI中的数据项ID - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 - updateData = true; // 设置更新数据标记 - break; - default: - // 如果URI不匹配任何已知模式,抛出异常 - throw new IllegalArgumentException("Unknown URI " + uri); - } - - // 如果更新了数据,通知变更 - if (count > 0) { - if (updateData) { - // 如果更新的是数据,通知笔记URI变更 - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - // 通知原始URI变更 - getContext().getContentResolver().notifyChange(uri, null); - } - - // 返回更新的记录数 - return count; - } - - // 解析选择条件,用于构建SQL语句 - private String parseSelection(String selection) { - return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); - } - - // 增加笔记版本号 - private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { - StringBuilder sql = new StringBuilder(120); // 初始化StringBuilder用于构建SQL语句 - sql.append("UPDATE "); - sql.append(TABLE.NOTE); - sql.append(" SET "); - sql.append(NoteColumns.VERSION); - sql.append("=" + NoteColumns.VERSION + "+1 "); // 增加版本号 - - // 如果有ID或者选择条件,添加WHERE子句 - if (id > 0 || !TextUtils.isEmpty(selection)) { - sql.append(" WHERE "); - } - if (id > 0) { - sql.append(NoteColumns.ID + "=" + String.valueOf(id)); // 如果有ID,添加ID条件 - } - if (!TextUtils.isEmpty(selection)) { - String selectString = id > 0 ? parseSelection(selection) : selection; // 解析选择条件 - for (String args : selectionArgs) { - selectString = selectString.replaceFirst("\\?", args); // 替换选择参数 - } - sql.append(selectString); // 添加选择条件到SQL语句 - } - - mHelper.getWritableDatabase().execSQL(sql.toString()); // 执行SQL语句 - } - - // 实现ContentProvider的getType方法,用于返回URI的MIME类型 - @Override - public String getType(Uri uri) { - // TODO: 根据URI返回相应的MIME类型,此处为自动生成的方法存根,需要实现具体逻辑 - return null; - } -} diff --git a/doc/notes/gtask/data/MetaData.java b/doc/notes/gtask/data/MetaData.java deleted file mode 100644 index 88da7bf..0000000 --- a/doc/notes/gtask/data/MetaData.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - - -// MetaData类继承自Task类,用于处理元数据 -public class MetaData extends Task { - private final static String TAG = MetaData.class.getSimpleName(); // 日志标签,用于标识日志来源 - - private String mRelatedGid = null; // 相关的GTask ID - - // 设置元数据,将GTask ID和元信息放入JSONObject中,并设置笔记名称 - public void setMeta(String gid, JSONObject metaInfo) { - try { - metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); // 将GTask ID放入元信息中 - } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); // 日志记录错误信息 - } - setNotes(metaInfo.toString()); // 将JSONObject转换为字符串并设置为笔记内容 - setName(GTaskStringUtils.META_NOTE_NAME); // 设置笔记名称 - } - - // 获取相关的GTask ID - public String getRelatedGid() { - return mRelatedGid; - } - - // 重写isWorthSaving方法,判断笔记内容是否不为空 - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } - - // 重写setContentByRemoteJSON方法,从远程JSON中设置内容 - @Override - public void setContentByRemoteJSON(JSONObject js) { - super.setContentByRemoteJSON(js); // 调用父类方法设置内容 - if (getNotes() != null) { - try { - JSONObject metaInfo = new JSONObject(getNotes().trim()); // 将笔记内容转换为JSONObject - mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); // 获取GTask ID - } catch (JSONException e) { - Log.w(TAG, "failed to get related gid"); // 日志记录警告信息 - mRelatedGid = null; // 如果出现异常,将GTask ID设置为null - } - } - } - - // 重写setContentByLocalJSON方法,抛出异常,因为该方法不应该被调用 - @Override - public void setContentByLocalJSON(JSONObject js) { - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - } - - // 重写getLocalJSONFromContent方法,抛出异常,因为该方法不应该被调用 - @Override - public JSONObject getLocalJSONFromContent() { - throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); - } - - // 重写getSyncAction方法,抛出异常,因为该方法不应该被调用 - @Override - public int getSyncAction(Cursor c) { - throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - } -} - diff --git a/doc/notes/gtask/data/Node.java b/doc/notes/gtask/data/Node.java deleted file mode 100644 index 67ef9e3..0000000 --- a/doc/notes/gtask/data/Node.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; - -import org.json.JSONObject; - -// Node类是一个抽象类,用于表示同步操作的节点 -public abstract class Node { - // 同步操作常量,表示不需要执行任何同步操作 - public static final int SYNC_ACTION_NONE = 0; - // 同步操作常量,表示需要添加远程数据 - public static final int SYNC_ACTION_ADD_REMOTE = 1; - // 同步操作常量,表示需要添加本地数据 - public static final int SYNC_ACTION_ADD_LOCAL = 2; - // 同步操作常量,表示需要删除远程数据 - public static final int SYNC_ACTION_DEL_REMOTE = 3; - // 同步操作常量,表示需要删除本地数据 - public static final int SYNC_ACTION_DEL_LOCAL = 4; - // 同步操作常量,表示需要更新远程数据 - public static final int SYNC_ACTION_UPDATE_REMOTE = 5; - // 同步操作常量,表示需要更新本地数据 - public static final int SYNC_ACTION_UPDATE_LOCAL = 6; - // 同步操作常量,表示存在更新冲突 - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; - // 同步操作常量,表示同步操作出现错误 - public static final int SYNC_ACTION_ERROR = 8; - - private String mGid; // 节点的GTask ID - private String mName; // 节点的名称 - private long mLastModified; // 节点最后修改时间 - private boolean mDeleted; // 节点是否被删除的标志 - - // Node类的构造函数,初始化成员变量 - public Node() { - mGid = null; - mName = ""; - mLastModified = 0; - mDeleted = false; - } - - // 抽象方法,用于获取创建操作的JSON对象 - public abstract JSONObject getCreateAction(int actionId); - - // 抽象方法,用于获取更新操作的JSON对象 - public abstract JSONObject getUpdateAction(int actionId); - - // 抽象方法,用于根据远程JSON设置内容 - public abstract void setContentByRemoteJSON(JSONObject js); - - // 抽象方法,用于根据本地JSON设置内容 - public abstract void setContentByLocalJSON(JSONObject js); - - // 抽象方法,用于从内容获取本地JSON对象 - public abstract JSONObject getLocalJSONFromContent(); - - // 抽象方法,用于获取同步操作类型 - public abstract int getSyncAction(Cursor c); - - // 设置节点的GTask ID - public void setGid(String gid) { - this.mGid = gid; - } - - // 设置节点的名称 - public void setName(String name) { - this.mName = name; - } - - // 设置节点最后修改时间 - public void setLastModified(long lastModified) { - this.mLastModified = lastModified; - } - - // 设置节点是否被删除的标志 - public void setDeleted(boolean deleted) { - this.mDeleted = deleted; - } - - // 获取节点的GTask ID - public String getGid() { - return this.mGid; - } - - // 获取节点的名称 - public String getName() { - return this.mName; - } - - // 获取节点最后修改时间 - public long getLastModified() { - return this.mLastModified; - } - - // 获取节点是否被删除的标志 - public boolean getDeleted() { - return this.mDeleted; - } - -} - diff --git a/doc/notes/gtask/data/SqlData.java b/doc/notes/gtask/data/SqlData.java deleted file mode 100644 index d3ec3be..0000000 --- a/doc/notes/gtask/data/SqlData.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; -import net.micode.notes.gtask.exception.ActionFailureException; - -import org.json.JSONException; -import org.json.JSONObject; - - -public class SqlData { - private static final String TAG = SqlData.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - public static final int DATA_ID_COLUMN = 0; - - public static final int DATA_MIME_TYPE_COLUMN = 1; - - public static final int DATA_CONTENT_COLUMN = 2; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID; - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - private void loadFromCursor(Cursor c) { - mDataId = c.getLong(DATA_ID_COLUMN); - mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); - mDataContent = c.getString(DATA_CONTENT_COLUMN); - mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); - mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); - } - - public void setContent(JSONObject js) throws JSONException { - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - JSONObject js = new JSONObject(); - js.put(DataColumns.ID, mDataId); - js.put(DataColumns.MIME_TYPE, mDataMimeType); - js.put(DataColumns.CONTENT, mDataContent); - js.put(DataColumns.DATA1, mDataContentData1); - js.put(DataColumns.DATA3, mDataContentData3); - return js; - } - - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - mDataId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - } else { - if (mDiffDataValues.size() > 0) { - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, - " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { - String.valueOf(noteId), String.valueOf(version) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - } - - mDiffDataValues.clear(); - mIsCreate = false; - } - - public long getId() { - return mDataId; - } -} diff --git a/doc/notes/gtask/data/SqlNote.java b/doc/notes/gtask/data/SqlNote.java deleted file mode 100644 index 79a4095..0000000 --- a/doc/notes/gtask/data/SqlNote.java +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.appwidget.AppWidgetManager; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.tool.ResourceParser; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class SqlNote { - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_NOTE = new String[] { - NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList mDataList; - - public SqlNote(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mId = INVALID_ID; - mAlertDate = 0; - mBgColorId = ResourceParser.getDefaultBgId(context); - mCreatedDate = System.currentTimeMillis(); - mHasAttachment = 0; - mModifiedDate = System.currentTimeMillis(); - mParentId = 0; - mSnippet = ""; - mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - mOriginParent = 0; - mVersion = 0; - mDiffNoteValues = new ContentValues(); - mDataList = new ArrayList(); - } - - public SqlNote(Context context, Cursor c) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - } - - public SqlNote(Context context, long id) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(id); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - - } - - private void loadFromCursor(long id) { - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(id) - }, null); - if (c != null) { - c.moveToNext(); - loadFromCursor(c); - } else { - Log.w(TAG, "loadFromCursor: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - private void loadFromCursor(Cursor c) { - mId = c.getLong(ID_COLUMN); - mAlertDate = c.getLong(ALERTED_DATE_COLUMN); - mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = c.getLong(CREATED_DATE_COLUMN); - mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); - mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); - mParentId = c.getLong(PARENT_ID_COLUMN); - mSnippet = c.getString(SNIPPET_COLUMN); - mType = c.getInt(TYPE_COLUMN); - mWidgetId = c.getInt(WIDGET_ID_COLUMN); - mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); - mVersion = c.getLong(VERSION_COLUMN); - } - - private void loadDataContent() { - Cursor c = null; - mDataList.clear(); - try { - c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, - "(note_id=?)", new String[] { - String.valueOf(mId) - }, null); - if (c != null) { - if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); - return; - } - while (c.moveToNext()) { - SqlData data = new SqlData(mContext, c); - mDataList.add(data); - } - } else { - Log.w(TAG, "loadDataContent: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - public boolean setContent(JSONObject js) { - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - Log.w(TAG, "cannot set system folder"); - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; - if (mIsCreate || mId != id) { - mDiffNoteValues.put(NoteColumns.ID, id); - } - mId = id; - - long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note - .getLong(NoteColumns.ALERTED_DATE) : 0; - if (mIsCreate || mAlertDate != alertDate) { - mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); - } - mAlertDate = alertDate; - - int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note - .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); - if (mIsCreate || mBgColorId != bgColorId) { - mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); - } - mBgColorId = bgColorId; - - long createDate = note.has(NoteColumns.CREATED_DATE) ? note - .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mCreatedDate != createDate) { - mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); - } - mCreatedDate = createDate; - - int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note - .getInt(NoteColumns.HAS_ATTACHMENT) : 0; - if (mIsCreate || mHasAttachment != hasAttachment) { - mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); - } - mHasAttachment = hasAttachment; - - long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note - .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mModifiedDate != modifiedDate) { - mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); - } - mModifiedDate = modifiedDate; - - long parentId = note.has(NoteColumns.PARENT_ID) ? note - .getLong(NoteColumns.PARENT_ID) : 0; - if (mIsCreate || mParentId != parentId) { - mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); - } - mParentId = parentId; - - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - - int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) - : AppWidgetManager.INVALID_APPWIDGET_ID; - if (mIsCreate || mWidgetId != widgetId) { - mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); - } - mWidgetId = widgetId; - - int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note - .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; - if (mIsCreate || mWidgetType != widgetType) { - mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); - } - mWidgetType = widgetType; - - long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note - .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; - if (mIsCreate || mOriginParent != originParent) { - mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); - } - mOriginParent = originParent; - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - SqlData sqlData = null; - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - for (SqlData temp : mDataList) { - if (dataId == temp.getId()) { - sqlData = temp; - } - } - } - - if (sqlData == null) { - sqlData = new SqlData(mContext); - mDataList.add(sqlData); - } - - sqlData.setContent(data); - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } - return true; - } - - public JSONObject getContent() { - try { - JSONObject js = new JSONObject(); - - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - - JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.ALERTED_DATE, mAlertDate); - note.put(NoteColumns.BG_COLOR_ID, mBgColorId); - note.put(NoteColumns.CREATED_DATE, mCreatedDate); - note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); - note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); - note.put(NoteColumns.PARENT_ID, mParentId); - note.put(NoteColumns.SNIPPET, mSnippet); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.WIDGET_ID, mWidgetId); - note.put(NoteColumns.WIDGET_TYPE, mWidgetType); - note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - - JSONArray dataArray = new JSONArray(); - for (SqlData sqlData : mDataList) { - JSONObject data = sqlData.getContent(); - if (data != null) { - dataArray.put(data); - } - } - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.SNIPPET, mSnippet); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - } - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - return null; - } - - public void setParentId(long id) { - mParentId = id; - mDiffNoteValues.put(NoteColumns.PARENT_ID, id); - } - - public void setGtaskId(String gid) { - mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); - } - - public void setSyncId(long syncId) { - mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); - } - - public void resetLocalModified() { - mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); - } - - public long getId() { - return mId; - } - - public long getParentId() { - return mParentId; - } - - public String getSnippet() { - return mSnippet; - } - - public boolean isNoteType() { - return mType == Notes.TYPE_NOTE; - } - - public void commit(boolean validateVersion) { - if (mIsCreate) { - if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { - mDiffNoteValues.remove(NoteColumns.ID); - } - - Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); - try { - mId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - if (mId == 0) { - throw new IllegalStateException("Create thread id failed"); - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, false, -1); - } - } - } else { - if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { - Log.e(TAG, "No such note"); - throw new IllegalStateException("Try to update note with invalid id"); - } - if (mDiffNoteValues.size() > 0) { - mVersion ++; - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?)", new String[] { - String.valueOf(mId) - }); - } else { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", - new String[] { - String.valueOf(mId), String.valueOf(mVersion) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, validateVersion, mVersion); - } - } - } - - // refresh local info - loadFromCursor(mId); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - - mDiffNoteValues.clear(); - mIsCreate = false; - } -} diff --git a/doc/notes/gtask/data/Task.java b/doc/notes/gtask/data/Task.java deleted file mode 100644 index 6a19454..0000000 --- a/doc/notes/gtask/data/Task.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - - -public class Task extends Node { - private static final String TAG = Task.class.getSimpleName(); - - private boolean mCompleted; - - private String mNotes; - - private JSONObject mMetaInfo; - - private Task mPriorSibling; - - private TaskList mParent; - - public Task() { - super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null; - mParent = null; - mMetaInfo = null; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_id - js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - - // dest_parent_type - js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - - // list_id - js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - - // prior_sibling_id - if (mPriorSibling != null) { - js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - // notes - if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { - setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); - } - - // deleted - if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { - setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); - } - - // completed - if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { - setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get task content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { - Log.e(TAG, "invalid type"); - return; - } - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - setName(data.getString(DataColumns.CONTENT)); - break; - } - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - String name = getName(); - try { - if (mMetaInfo == null) { - // new task created from web - if (name == null) { - Log.w(TAG, "the note seems to be an empty one"); - return null; - } - - JSONObject js = new JSONObject(); - JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); - JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); - dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - return js; - } else { - // synced task - JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); - break; - } - } - - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public void setMetaInfo(MetaData metaData) { - if (metaData != null && metaData.getNotes() != null) { - try { - mMetaInfo = new JSONObject(metaData.getNotes()); - } catch (JSONException e) { - Log.w(TAG, e.toString()); - mMetaInfo = null; - } - } - } - - public int getSyncAction(Cursor c) { - try { - JSONObject noteInfo = null; - if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - } - - if (noteInfo == null) { - Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; - } - - if (!noteInfo.has(NoteColumns.ID)) { - Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - // validate the note id now - if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { - Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - return SYNC_ACTION_UPDATE_CONFLICT; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public boolean isWorthSaving() { - return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) - || (getNotes() != null && getNotes().trim().length() > 0); - } - - public void setCompleted(boolean completed) { - this.mCompleted = completed; - } - - public void setNotes(String notes) { - this.mNotes = notes; - } - - public void setPriorSibling(Task priorSibling) { - this.mPriorSibling = priorSibling; - } - - public void setParent(TaskList parent) { - this.mParent = parent; - } - - public boolean getCompleted() { - return this.mCompleted; - } - - public String getNotes() { - return this.mNotes; - } - - public Task getPriorSibling() { - return this.mPriorSibling; - } - - public TaskList getParent() { - return this.mParent; - } - -} diff --git a/doc/notes/gtask/data/TaskList.java b/doc/notes/gtask/data/TaskList.java deleted file mode 100644 index 4ea21c5..0000000 --- a/doc/notes/gtask/data/TaskList.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName(); - - private int mIndex; - - private ArrayList mChildren; - - public TaskList() { - super(); - mChildren = new ArrayList(); - mIndex = 1; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get tasklist content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - - if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - String name = folder.getString(NoteColumns.SNIPPET); - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); - } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); - else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE); - else - Log.e(TAG, "invalid system folder"); - } else { - Log.e(TAG, "error type"); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - try { - JSONObject js = new JSONObject(); - JSONObject folder = new JSONObject(); - - String folderName = getName(); - if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) - folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), - folderName.length()); - folder.put(NoteColumns.SNIPPET, folderName); - if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) - || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) - folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - else - folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - - js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public int getSyncAction(Cursor c) { - try { - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - // for folder conflicts, just apply local modification - return SYNC_ACTION_UPDATE_REMOTE; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public int getChildTaskCount() { - return mChildren.size(); - } - - public boolean addChildTask(Task task) { - boolean ret = false; - if (task != null && !mChildren.contains(task)) { - ret = mChildren.add(task); - if (ret) { - // need to set prior sibling and parent - task.setPriorSibling(mChildren.isEmpty() ? null : mChildren - .get(mChildren.size() - 1)); - task.setParent(this); - } - } - return ret; - } - - public boolean addChildTask(Task task, int index) { - if (index < 0 || index > mChildren.size()) { - Log.e(TAG, "add child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (task != null && pos == -1) { - mChildren.add(index, task); - - // update the task list - Task preTask = null; - Task afterTask = null; - if (index != 0) - preTask = mChildren.get(index - 1); - if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); - - task.setPriorSibling(preTask); - if (afterTask != null) - afterTask.setPriorSibling(task); - } - - return true; - } - - public boolean removeChildTask(Task task) { - boolean ret = false; - int index = mChildren.indexOf(task); - if (index != -1) { - ret = mChildren.remove(task); - - if (ret) { - // reset prior sibling and parent - task.setPriorSibling(null); - task.setParent(null); - - // update the task list - if (index != mChildren.size()) { - mChildren.get(index).setPriorSibling( - index == 0 ? null : mChildren.get(index - 1)); - } - } - } - return ret; - } - - public boolean moveChildTask(Task task, int index) { - - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "move child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (pos == -1) { - Log.e(TAG, "move child task: the task should in the list"); - return false; - } - - if (pos == index) - return true; - return (removeChildTask(task) && addChildTask(task, index)); - } - - public Task findChildTaskByGid(String gid) { - for (int i = 0; i < mChildren.size(); i++) { - Task t = mChildren.get(i); - if (t.getGid().equals(gid)) { - return t; - } - } - return null; - } - - public int getChildTaskIndex(Task task) { - return mChildren.indexOf(task); - } - - public Task getChildTaskByIndex(int index) { - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "getTaskByIndex: invalid index"); - return null; - } - return mChildren.get(index); - } - - public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) { - if (task.getGid().equals(gid)) - return task; - } - return null; - } - - public ArrayList getChildTaskList() { - return this.mChildren; - } - - public void setIndex(int index) { - this.mIndex = index; - } - - public int getIndex() { - return this.mIndex; - } -} diff --git a/doc/notes/gtask/exception/ActionFailureException.java b/doc/notes/gtask/exception/ActionFailureException.java deleted file mode 100644 index 15504be..0000000 --- a/doc/notes/gtask/exception/ActionFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.exception; - -public class ActionFailureException extends RuntimeException { - private static final long serialVersionUID = 4425249765923293627L; - - public ActionFailureException() { - super(); - } - - public ActionFailureException(String paramString) { - super(paramString); - } - - public ActionFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/doc/notes/gtask/exception/NetworkFailureException.java b/doc/notes/gtask/exception/NetworkFailureException.java deleted file mode 100644 index b08cfb1..0000000 --- a/doc/notes/gtask/exception/NetworkFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.exception; - -public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - - public NetworkFailureException() { - super(); - } - - public NetworkFailureException(String paramString) { - super(paramString); - } - - public NetworkFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/doc/notes/gtask/remote/GTaskASyncTask.java b/doc/notes/gtask/remote/GTaskASyncTask.java deleted file mode 100644 index a1deb99..0000000 --- a/doc/notes/gtask/remote/GTaskASyncTask.java +++ /dev/null @@ -1,124 +0,0 @@ - -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; - -import net.micode.notes.R; -import net.micode.notes.ui.NotesListActivity; -import net.micode.notes.ui.NotesPreferenceActivity; - - -public class GTaskASyncTask extends AsyncTask { - - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - - public interface OnCompleteListener { - void onComplete(); - } - - private Context mContext; - - private NotificationManager mNotifiManager; - - private GTaskManager mTaskManager; - - private OnCompleteListener mOnCompleteListener; - - public GTaskASyncTask(Context context, OnCompleteListener listener) { - mContext = context; - mOnCompleteListener = listener; - mNotifiManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - mTaskManager = GTaskManager.getInstance(); - } - - public void cancelSync() { - mTaskManager.cancelSync(); - } - - public void publishProgess(String message) { - publishProgress(new String[] { - message - }); - } - - private void showNotification(int tickerId, String content) { - PendingIntent pendingIntent; - if (tickerId != R.string.ticker_success) { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE); - } else { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE); - } - Notification.Builder builder = new Notification.Builder(mContext) - .setAutoCancel(true) - .setContentTitle(mContext.getString(R.string.app_name)) - .setContentText(content) - .setContentIntent(pendingIntent) - .setWhen(System.currentTimeMillis()) - .setOngoing(true); - Notification notification=builder.getNotification(); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); - } - - @Override - protected Integer doInBackground(Void... unused) { - publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); - return mTaskManager.sync(mContext, this); - } - - @Override - protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { - ((GTaskSyncService) mContext).sendBroadcast(progress[0]); - } - } - - @Override - protected void onPostExecute(Integer result) { - if (result == GTaskManager.STATE_SUCCESS) { - showNotification(R.string.ticker_success, mContext.getString( - R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); - } else if (result == GTaskManager.STATE_NETWORK_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); - } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); - } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { - showNotification(R.string.ticker_cancel, mContext - .getString(R.string.error_sync_cancelled)); - } - if (mOnCompleteListener != null) { - new Thread(new Runnable() { - - public void run() { - mOnCompleteListener.onComplete(); - } - }).start(); - } - } -} diff --git a/doc/notes/gtask/remote/GTaskClient.java b/doc/notes/gtask/remote/GTaskClient.java deleted file mode 100644 index c67dfdf..0000000 --- a/doc/notes/gtask/remote/GTaskClient.java +++ /dev/null @@ -1,585 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AccountManagerFuture; -import android.app.Activity; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.gtask.data.Node; -import net.micode.notes.gtask.data.Task; -import net.micode.notes.gtask.data.TaskList; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.gtask.exception.NetworkFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.ui.NotesPreferenceActivity; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.cookie.Cookie; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.LinkedList; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.Inflater; -import java.util.zip.InflaterInputStream; - - -public class GTaskClient { - private static final String TAG = GTaskClient.class.getSimpleName(); - - private static final String GTASK_URL = "https://mail.google.com/tasks/"; - - private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; - - private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; - - private static GTaskClient mInstance = null; - - private DefaultHttpClient mHttpClient; - - private String mGetUrl; - - private String mPostUrl; - - private long mClientVersion; - - private boolean mLoggedin; - - private long mLastLoginTime; - - private int mActionId; - - private Account mAccount; - - private JSONArray mUpdateArray; - - private GTaskClient() { - mHttpClient = null; - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - mClientVersion = -1; - mLoggedin = false; - mLastLoginTime = 0; - mActionId = 1; - mAccount = null; - mUpdateArray = null; - } - - public static synchronized GTaskClient getInstance() { - if (mInstance == null) { - mInstance = new GTaskClient(); - } - return mInstance; - } - - public boolean login(Activity activity) { - // we suppose that the cookie would expire after 5 minutes - // then we need to re-login - final long interval = 1000 * 60 * 5; - if (mLastLoginTime + interval < System.currentTimeMillis()) { - mLoggedin = false; - } - - // need to re-login after account switch - if (mLoggedin - && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity - .getSyncAccountName(activity))) { - mLoggedin = false; - } - - if (mLoggedin) { - Log.d(TAG, "already logged in"); - return true; - } - - mLastLoginTime = System.currentTimeMillis(); - String authToken = loginGoogleAccount(activity, false); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - // login with custom domain if necessary - if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() - .endsWith("googlemail.com"))) { - StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); - int index = mAccount.name.indexOf('@') + 1; - String suffix = mAccount.name.substring(index); - url.append(suffix + "/"); - mGetUrl = url.toString() + "ig"; - mPostUrl = url.toString() + "r/ig"; - - if (tryToLoginGtask(activity, authToken)) { - mLoggedin = true; - } - } - - // try to login with google official url - if (!mLoggedin) { - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - if (!tryToLoginGtask(activity, authToken)) { - return false; - } - } - - mLoggedin = true; - return true; - } - - private String loginGoogleAccount(Activity activity, boolean invalidateToken) { - String authToken; - AccountManager accountManager = AccountManager.get(activity); - Account[] accounts = accountManager.getAccountsByType("com.google"); - - if (accounts.length == 0) { - Log.e(TAG, "there is no available google account"); - return null; - } - - String accountName = NotesPreferenceActivity.getSyncAccountName(activity); - Account account = null; - for (Account a : accounts) { - if (a.name.equals(accountName)) { - account = a; - break; - } - } - if (account != null) { - mAccount = account; - } else { - Log.e(TAG, "unable to get an account with the same name in the settings"); - return null; - } - - // get the token now - AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, - "goanna_mobile", null, activity, null, null); - try { - Bundle authTokenBundle = accountManagerFuture.getResult(); - authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); - if (invalidateToken) { - accountManager.invalidateAuthToken("com.google", authToken); - loginGoogleAccount(activity, false); - } - } catch (Exception e) { - Log.e(TAG, "get auth token failed"); - authToken = null; - } - - return authToken; - } - - private boolean tryToLoginGtask(Activity activity, String authToken) { - if (!loginGtask(authToken)) { - // maybe the auth token is out of date, now let's invalidate the - // token and try again - authToken = loginGoogleAccount(activity, true); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - if (!loginGtask(authToken)) { - Log.e(TAG, "login gtask failed"); - return false; - } - } - return true; - } - - private boolean loginGtask(String authToken) { - int timeoutConnection = 10000; - int timeoutSocket = 15000; - HttpParams httpParameters = new BasicHttpParams(); - HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); - HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); - mHttpClient = new DefaultHttpClient(httpParameters); - BasicCookieStore localBasicCookieStore = new BasicCookieStore(); - mHttpClient.setCookieStore(localBasicCookieStore); - HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); - - // login gtask - try { - String loginUrl = mGetUrl + "?auth=" + authToken; - HttpGet httpGet = new HttpGet(loginUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the cookie now - List cookies = mHttpClient.getCookieStore().getCookies(); - boolean hasAuthCookie = false; - for (Cookie cookie : cookies) { - if (cookie.getName().contains("GTL")) { - hasAuthCookie = true; - } - } - if (!hasAuthCookie) { - Log.w(TAG, "it seems that there is no auth cookie"); - } - - // get the client version - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - mClientVersion = js.getLong("v"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } catch (Exception e) { - // simply catch all exceptions - Log.e(TAG, "httpget gtask_url failed"); - return false; - } - - return true; - } - - private int getActionId() { - return mActionId++; - } - - private HttpPost createHttpPost() { - HttpPost httpPost = new HttpPost(mPostUrl); - httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); - httpPost.setHeader("AT", "1"); - return httpPost; - } - - private String getResponseContent(HttpEntity entity) throws IOException { - String contentEncoding = null; - if (entity.getContentEncoding() != null) { - contentEncoding = entity.getContentEncoding().getValue(); - Log.d(TAG, "encoding: " + contentEncoding); - } - - InputStream input = entity.getContent(); - if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { - input = new GZIPInputStream(entity.getContent()); - } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { - Inflater inflater = new Inflater(true); - input = new InflaterInputStream(entity.getContent(), inflater); - } - - try { - InputStreamReader isr = new InputStreamReader(input); - BufferedReader br = new BufferedReader(isr); - StringBuilder sb = new StringBuilder(); - - while (true) { - String buff = br.readLine(); - if (buff == null) { - return sb.toString(); - } - sb = sb.append(buff); - } - } finally { - input.close(); - } - } - - private JSONObject postRequest(JSONObject js) throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - HttpPost httpPost = createHttpPost(); - try { - LinkedList list = new LinkedList(); - list.add(new BasicNameValuePair("r", js.toString())); - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); - httpPost.setEntity(entity); - - // execute the post - HttpResponse response = mHttpClient.execute(httpPost); - String jsString = getResponseContent(response.getEntity()); - return new JSONObject(jsString); - - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("unable to convert response content to jsonobject"); - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("error occurs when posting request"); - } - } - - public void createTask(Task task) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(task.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create task: handing jsonobject failed"); - } - } - - public void createTaskList(TaskList tasklist) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(tasklist.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create tasklist: handing jsonobject failed"); - } - } - - public void commitUpdate() throws NetworkFailureException { - if (mUpdateArray != null) { - try { - JSONObject jsPost = new JSONObject(); - - // action_list - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("commit update: handing jsonobject failed"); - } - } - } - - public void addUpdateNode(Node node) throws NetworkFailureException { - if (node != null) { - // too many update items may result in an error - // set max to 10 items - if (mUpdateArray != null && mUpdateArray.length() > 10) { - commitUpdate(); - } - - if (mUpdateArray == null) - mUpdateArray = new JSONArray(); - mUpdateArray.put(node.getUpdateAction(getActionId())); - } - } - - public void moveTask(Task task, TaskList preParent, TaskList curParent) - throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); - if (preParent == curParent && task.getPriorSibling() != null) { - // put prioring_sibing_id only if moving within the tasklist and - // it is not the first one - action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); - } - action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); - action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); - if (preParent != curParent) { - // put the dest_list only if moving between tasklists - action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); - } - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("move task: handing jsonobject failed"); - } - } - - public void deleteNode(Node node) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - node.setDeleted(true); - actionList.put(node.getUpdateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("delete node: handing jsonobject failed"); - } - } - - public JSONArray getTaskLists() throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - try { - HttpGet httpGet = new HttpGet(mGetUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the task list - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task lists: handing jasonobject failed"); - } - } - - public JSONArray getTaskList(String listGid) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); - action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - JSONObject jsResponse = postRequest(jsPost); - return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task list: handing jsonobject failed"); - } - } - - public Account getSyncAccount() { - return mAccount; - } - - public void resetUpdateArray() { - mUpdateArray = null; - } -} diff --git a/doc/notes/gtask/remote/GTaskManager.java b/doc/notes/gtask/remote/GTaskManager.java deleted file mode 100644 index d2b4082..0000000 --- a/doc/notes/gtask/remote/GTaskManager.java +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Activity; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.data.MetaData; -import net.micode.notes.gtask.data.Node; -import net.micode.notes.gtask.data.SqlNote; -import net.micode.notes.gtask.data.Task; -import net.micode.notes.gtask.data.TaskList; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.gtask.exception.NetworkFailureException; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; - - -public class GTaskManager { - private static final String TAG = GTaskManager.class.getSimpleName(); - - public static final int STATE_SUCCESS = 0; - - public static final int STATE_NETWORK_ERROR = 1; - - public static final int STATE_INTERNAL_ERROR = 2; - - public static final int STATE_SYNC_IN_PROGRESS = 3; - - public static final int STATE_SYNC_CANCELLED = 4; - - private static GTaskManager mInstance = null; - - private Activity mActivity; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mSyncing; - - private boolean mCancelled; - - private HashMap mGTaskListHashMap; - - private HashMap mGTaskHashMap; - - private HashMap mMetaHashMap; - - private TaskList mMetaList; - - private HashSet mLocalDeleteIdMap; - - private HashMap mGidToNid; - - private HashMap mNidToGid; - - private GTaskManager() { - mSyncing = false; - mCancelled = false; - mGTaskListHashMap = new HashMap(); - mGTaskHashMap = new HashMap(); - mMetaHashMap = new HashMap(); - mMetaList = null; - mLocalDeleteIdMap = new HashSet(); - mGidToNid = new HashMap(); - mNidToGid = new HashMap(); - } - - public static synchronized GTaskManager getInstance() { - if (mInstance == null) { - mInstance = new GTaskManager(); - } - return mInstance; - } - - public synchronized void setActivityContext(Activity activity) { - // used for getting authtoken - mActivity = activity; - } - - public int sync(Context context, GTaskASyncTask asyncTask) { - if (mSyncing) { - Log.d(TAG, "Sync is in progress"); - return STATE_SYNC_IN_PROGRESS; - } - mContext = context; - mContentResolver = mContext.getContentResolver(); - mSyncing = true; - mCancelled = false; - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - - try { - GTaskClient client = GTaskClient.getInstance(); - client.resetUpdateArray(); - - // login google task - if (!mCancelled) { - if (!client.login(mActivity)) { - throw new NetworkFailureException("login google task failed"); - } - } - - // get the task list from google - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); - initGTaskList(); - - // do content sync work - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); - syncContent(); - } catch (NetworkFailureException e) { - Log.e(TAG, e.toString()); - return STATE_NETWORK_ERROR; - } catch (ActionFailureException e) { - Log.e(TAG, e.toString()); - return STATE_INTERNAL_ERROR; - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return STATE_INTERNAL_ERROR; - } finally { - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - mSyncing = false; - } - - return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; - } - - private void initGTaskList() throws NetworkFailureException { - if (mCancelled) - return; - GTaskClient client = GTaskClient.getInstance(); - try { - JSONArray jsTaskLists = client.getTaskLists(); - - // init meta list first - mMetaList = null; - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name - .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - mMetaList = new TaskList(); - mMetaList.setContentByRemoteJSON(object); - - // load meta data - JSONArray jsMetas = client.getTaskList(gid); - for (int j = 0; j < jsMetas.length(); j++) { - object = (JSONObject) jsMetas.getJSONObject(j); - MetaData metaData = new MetaData(); - metaData.setContentByRemoteJSON(object); - if (metaData.isWorthSaving()) { - mMetaList.addChildTask(metaData); - if (metaData.getGid() != null) { - mMetaHashMap.put(metaData.getRelatedGid(), metaData); - } - } - } - } - } - - // create meta list if not existed - if (mMetaList == null) { - mMetaList = new TaskList(); - mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META); - GTaskClient.getInstance().createTaskList(mMetaList); - } - - // init task list - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) - && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META)) { - TaskList tasklist = new TaskList(); - tasklist.setContentByRemoteJSON(object); - mGTaskListHashMap.put(gid, tasklist); - mGTaskHashMap.put(gid, tasklist); - - // load tasks - JSONArray jsTasks = client.getTaskList(gid); - for (int j = 0; j < jsTasks.length(); j++) { - object = (JSONObject) jsTasks.getJSONObject(j); - gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - Task task = new Task(); - task.setContentByRemoteJSON(object); - if (task.isWorthSaving()) { - task.setMetaInfo(mMetaHashMap.get(gid)); - tasklist.addChildTask(task); - mGTaskHashMap.put(gid, task); - } - } - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("initGTaskList: handing JSONObject failed"); - } - } - - private void syncContent() throws NetworkFailureException { - int syncType; - Cursor c = null; - String gid; - Node node; - - mLocalDeleteIdMap.clear(); - - if (mCancelled) { - return; - } - - // for local deleted note - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id=?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, null); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); - } - - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - } - } else { - Log.w(TAG, "failed to query trash folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // sync folder first - syncFolder(); - - // for note existing in database - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing note in database"); - } - - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // go through remaining items - Iterator> iter = mGTaskHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - node = entry.getValue(); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - - // mCancelled can be set by another thread, so we neet to check one by - // one - // clear local delete table - if (!mCancelled) { - if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { - throw new ActionFailureException("failed to batch-delete local deleted notes"); - } - } - - // refresh local sync id - if (!mCancelled) { - GTaskClient.getInstance().commitUpdate(); - refreshLocalSyncId(); - } - - } - - private void syncFolder() throws NetworkFailureException { - Cursor c = null; - String gid; - Node node; - int syncType; - - if (mCancelled) { - return; - } - - // for root folder - try { - c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); - if (c != null) { - c.moveToNext(); - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); - mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); - // for system folder, only update remote name if necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } else { - Log.w(TAG, "failed to query root folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for call-note folder - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(Notes.ID_CALL_RECORD_FOLDER) - }, null); - if (c != null) { - if (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); - mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); - // for system folder, only update remote name if - // necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } - } else { - Log.w(TAG, "failed to query call note folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for local existing folders - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for remote add folders - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - gid = entry.getKey(); - node = entry.getValue(); - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - } - - if (!mCancelled) - GTaskClient.getInstance().commitUpdate(); - } - - private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - MetaData meta; - switch (syncType) { - case Node.SYNC_ACTION_ADD_LOCAL: - addLocalNode(node); - break; - case Node.SYNC_ACTION_ADD_REMOTE: - addRemoteNode(node, c); - break; - case Node.SYNC_ACTION_DEL_LOCAL: - meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - break; - case Node.SYNC_ACTION_DEL_REMOTE: - meta = mMetaHashMap.get(node.getGid()); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - GTaskClient.getInstance().deleteNode(node); - break; - case Node.SYNC_ACTION_UPDATE_LOCAL: - updateLocalNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_REMOTE: - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_CONFLICT: - // merging both modifications maybe a good idea - // right now just use local update simply - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_NONE: - break; - case Node.SYNC_ACTION_ERROR: - default: - throw new ActionFailureException("unkown sync action type"); - } - } - - private void addLocalNode(Node node) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - if (node instanceof TaskList) { - if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { - sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); - } else if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { - sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); - } else { - sqlNote = new SqlNote(mContext); - sqlNote.setContent(node.getLocalJSONFromContent()); - sqlNote.setParentId(Notes.ID_ROOT_FOLDER); - } - } else { - sqlNote = new SqlNote(mContext); - JSONObject js = node.getLocalJSONFromContent(); - try { - if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.has(NoteColumns.ID)) { - long id = note.getLong(NoteColumns.ID); - if (DataUtils.existInNoteDatabase(mContentResolver, id)) { - // the id is not available, have to create a new one - note.remove(NoteColumns.ID); - } - } - } - - if (js.has(GTaskStringUtils.META_HEAD_DATA)) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { - // the data id is not available, have to create - // a new one - data.remove(DataColumns.ID); - } - } - } - - } - } catch (JSONException e) { - Log.w(TAG, e.toString()); - e.printStackTrace(); - } - sqlNote.setContent(js); - - Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot add local node"); - } - sqlNote.setParentId(parentId.longValue()); - } - - // create the local node - sqlNote.setGtaskId(node.getGid()); - sqlNote.commit(false); - - // update gid-nid mapping - mGidToNid.put(node.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), node.getGid()); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - } - - private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - // update the note locally - sqlNote = new SqlNote(mContext, c); - sqlNote.setContent(node.getLocalJSONFromContent()); - - Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) - : new Long(Notes.ID_ROOT_FOLDER); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot update local node"); - } - sqlNote.setParentId(parentId.longValue()); - sqlNote.commit(true); - - // update meta info - updateRemoteMeta(node.getGid(), sqlNote); - } - - private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - Node n; - - // update remotely - if (sqlNote.isNoteType()) { - Task task = new Task(); - task.setContentByLocalJSON(sqlNote.getContent()); - - String parentGid = mNidToGid.get(sqlNote.getParentId()); - if (parentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot add remote task"); - } - mGTaskListHashMap.get(parentGid).addChildTask(task); - - GTaskClient.getInstance().createTask(task); - n = (Node) task; - - // add meta - updateRemoteMeta(task.getGid(), sqlNote); - } else { - TaskList tasklist = null; - - // we need to skip folder if it has already existed - String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; - if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) - folderName += GTaskStringUtils.FOLDER_DEFAULT; - else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) - folderName += GTaskStringUtils.FOLDER_CALL_NOTE; - else - folderName += sqlNote.getSnippet(); - - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - String gid = entry.getKey(); - TaskList list = entry.getValue(); - - if (list.getName().equals(folderName)) { - tasklist = list; - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - } - break; - } - } - - // no match we can add now - if (tasklist == null) { - tasklist = new TaskList(); - tasklist.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().createTaskList(tasklist); - mGTaskListHashMap.put(tasklist.getGid(), tasklist); - } - n = (Node) tasklist; - } - - // update local note - sqlNote.setGtaskId(n.getGid()); - sqlNote.commit(false); - sqlNote.resetLocalModified(); - sqlNote.commit(true); - - // gid-id mapping - mGidToNid.put(n.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), n.getGid()); - } - - private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - - // update remotely - node.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(node); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - - // move task if necessary - if (sqlNote.isNoteType()) { - Task task = (Task) node; - TaskList preParentList = task.getParent(); - - String curParentGid = mNidToGid.get(sqlNote.getParentId()); - if (curParentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot update remote task"); - } - TaskList curParentList = mGTaskListHashMap.get(curParentGid); - - if (preParentList != curParentList) { - preParentList.removeChildTask(task); - curParentList.addChildTask(task); - GTaskClient.getInstance().moveTask(task, preParentList, curParentList); - } - } - - // clear local modified flag - sqlNote.resetLocalModified(); - sqlNote.commit(true); - } - - private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { - if (sqlNote != null && sqlNote.isNoteType()) { - MetaData metaData = mMetaHashMap.get(gid); - if (metaData != null) { - metaData.setMeta(gid, sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(metaData); - } else { - metaData = new MetaData(); - metaData.setMeta(gid, sqlNote.getContent()); - mMetaList.addChildTask(metaData); - mMetaHashMap.put(gid, metaData); - GTaskClient.getInstance().createTask(metaData); - } - } - } - - private void refreshLocalSyncId() throws NetworkFailureException { - if (mCancelled) { - return; - } - - // get the latest gtask list - mGTaskHashMap.clear(); - mGTaskListHashMap.clear(); - mMetaHashMap.clear(); - initGTaskList(); - - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - String gid = c.getString(SqlNote.GTASK_ID_COLUMN); - Node node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - ContentValues values = new ContentValues(); - values.put(NoteColumns.SYNC_ID, node.getLastModified()); - mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - c.getLong(SqlNote.ID_COLUMN)), values, null, null); - } else { - Log.e(TAG, "something is missed"); - throw new ActionFailureException( - "some local items don't have gid after sync"); - } - } - } else { - Log.w(TAG, "failed to query local note to refresh sync id"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - } - - public String getSyncAccount() { - return GTaskClient.getInstance().getSyncAccount().name; - } - - public void cancelSync() { - mCancelled = true; - } -} diff --git a/doc/notes/gtask/remote/GTaskSyncService.java b/doc/notes/gtask/remote/GTaskSyncService.java deleted file mode 100644 index cca36f7..0000000 --- a/doc/notes/gtask/remote/GTaskSyncService.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Activity; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.IBinder; - -public class GTaskSyncService extends Service { - public final static String ACTION_STRING_NAME = "sync_action_type"; - - public final static int ACTION_START_SYNC = 0; - - public final static int ACTION_CANCEL_SYNC = 1; - - public final static int ACTION_INVALID = 2; - - public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; - - public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; - - public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; - - private static GTaskASyncTask mSyncTask = null; - - private static String mSyncProgress = ""; - - private void startSync() { - if (mSyncTask == null) { - mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { - public void onComplete() { - mSyncTask = null; - sendBroadcast(""); - stopSelf(); - } - }); - sendBroadcast(""); - mSyncTask.execute(); - } - } - - private void cancelSync() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - @Override - public void onCreate() { - mSyncTask = null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Bundle bundle = intent.getExtras(); - if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { - switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { - case ACTION_START_SYNC: - startSync(); - break; - case ACTION_CANCEL_SYNC: - cancelSync(); - break; - default: - break; - } - return START_STICKY; - } - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onLowMemory() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - public IBinder onBind(Intent intent) { - return null; - } - - public void sendBroadcast(String msg) { - mSyncProgress = msg; - Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); - intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); - intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); - sendBroadcast(intent); - } - - public static void startSync(Activity activity) { - GTaskManager.getInstance().setActivityContext(activity); - Intent intent = new Intent(activity, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); - activity.startService(intent); - } - - public static void cancelSync(Context context) { - Intent intent = new Intent(context, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); - context.startService(intent); - } - - public static boolean isSyncing() { - return mSyncTask != null; - } - - public static String getProgressString() { - return mSyncProgress; - } -} diff --git a/doc/notes/model/Note.java b/doc/notes/model/Note.java deleted file mode 100644 index 6706cf6..0000000 --- a/doc/notes/model/Note.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.model; -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.OperationApplicationException; -import android.net.Uri; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; - -import java.util.ArrayList; - - -public class Note { - private ContentValues mNoteDiffValues; - private NoteData mNoteData; - private static final String TAG = "Note"; - /** - * Create a new note id for adding a new note to databases - */ - public static synchronized long getNewNoteId(Context context, long folderId) { - // Create a new note in the database - ContentValues values = new ContentValues(); - long createdTime = System.currentTimeMillis(); - values.put(NoteColumns.CREATED_DATE, createdTime); - values.put(NoteColumns.MODIFIED_DATE, createdTime); - values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - values.put(NoteColumns.PARENT_ID, folderId); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); - - long noteId = 0; - try { - noteId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - noteId = 0; - } - if (noteId == -1) { - throw new IllegalStateException("Wrong note id:" + noteId); - } - return noteId; - } - - public Note() { - mNoteDiffValues = new ContentValues(); - mNoteData = new NoteData(); - } - - public void setNoteValue(String key, String value) { - mNoteDiffValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - public void setTextData(String key, String value) { - mNoteData.setTextData(key, value); - } - - public void setTextDataId(long id) { - mNoteData.setTextDataId(id); - } - - public long getTextDataId() { - return mNoteData.mTextDataId; - } - - public void setCallDataId(long id) { - mNoteData.setCallDataId(id); - } - - public void setCallData(String key, String value) { - mNoteData.setCallData(key, value); - } - - public boolean isLocalModified() { - return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - } - - public boolean syncNote(Context context, long noteId) { - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - if (!isLocalModified()) { - return true; - } - - /** - * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and - * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info - */ - if (context.getContentResolver().update( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, - null) == 0) { - Log.e(TAG, "Update note error, should not happen"); - // Do not return, fall through - } - mNoteDiffValues.clear(); - - if (mNoteData.isLocalModified() - && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { - return false; - } - - return true; - } - - private class NoteData { - private long mTextDataId; - - private ContentValues mTextDataValues; - - private long mCallDataId; - - private ContentValues mCallDataValues; - - private static final String TAG = "NoteData"; - - public NoteData() { - mTextDataValues = new ContentValues(); - mCallDataValues = new ContentValues(); - mTextDataId = 0; - mCallDataId = 0; - } - - boolean isLocalModified() { - return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; - } - - void setTextDataId(long id) { - if(id <= 0) { - throw new IllegalArgumentException("Text data id should larger than 0"); - } - mTextDataId = id; - } - - void setCallDataId(long id) { - if (id <= 0) { - throw new IllegalArgumentException("Call data id should larger than 0"); - } - mCallDataId = id; - } - - void setCallData(String key, String value) { - mCallDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - void setTextData(String key, String value) { - mTextDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - ArrayList operationList = new ArrayList(); - ContentProviderOperation.Builder builder = null; - - if(mTextDataValues.size() > 0) { - mTextDataValues.put(DataColumns.NOTE_ID, noteId); - if (mTextDataId == 0) { - mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); - try { - setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new text data fail with noteId" + noteId); - mTextDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mTextDataId)); - builder.withValues(mTextDataValues); - operationList.add(builder.build()); - } - mTextDataValues.clear(); - } - - if(mCallDataValues.size() > 0) { - mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { - mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mCallDataValues); - try { - setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new call data fail with noteId" + noteId); - mCallDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mCallDataId)); - builder.withValues(mCallDataValues); - operationList.add(builder.build()); - } - mCallDataValues.clear(); - } - - if (operationList.size() > 0) { - try { - ContentProviderResult[] results = context.getContentResolver().applyBatch( - Notes.AUTHORITY, operationList); - return (results == null || results.length == 0 || results[0] == null) ? null - : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } - } - return null; - } - } -} diff --git a/doc/notes/model/WorkingNote.java b/doc/notes/model/WorkingNote.java deleted file mode 100644 index be081e4..0000000 --- a/doc/notes/model/WorkingNote.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.model; - -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.tool.ResourceParser.NoteBgResources; - - -public class WorkingNote { - // Note for the working note - private Note mNote; - // Note Id - private long mNoteId; - // Note content - private String mContent; - // Note mode - private int mMode; - - private long mAlertDate; - - private long mModifiedDate; - - private int mBgColorId; - - private int mWidgetId; - - private int mWidgetType; - - private long mFolderId; - - private Context mContext; - - private static final String TAG = "WorkingNote"; - - private boolean mIsDeleted; - - private NoteSettingChangedListener mNoteSettingStatusListener; - - public static final String[] DATA_PROJECTION = new String[] { - DataColumns.ID, - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - public static final String[] NOTE_PROJECTION = new String[] { - NoteColumns.PARENT_ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - NoteColumns.MODIFIED_DATE - }; - - private static final int DATA_ID_COLUMN = 0; - - private static final int DATA_CONTENT_COLUMN = 1; - - private static final int DATA_MIME_TYPE_COLUMN = 2; - - private static final int DATA_MODE_COLUMN = 3; - - private static final int NOTE_PARENT_ID_COLUMN = 0; - - private static final int NOTE_ALERTED_DATE_COLUMN = 1; - - private static final int NOTE_BG_COLOR_ID_COLUMN = 2; - - private static final int NOTE_WIDGET_ID_COLUMN = 3; - - private static final int NOTE_WIDGET_TYPE_COLUMN = 4; - - private static final int NOTE_MODIFIED_DATE_COLUMN = 5; - - // New note construct - private WorkingNote(Context context, long folderId) { - mContext = context; - mAlertDate = 0; - mModifiedDate = System.currentTimeMillis(); - mFolderId = folderId; - mNote = new Note(); - mNoteId = 0; - mIsDeleted = false; - mMode = 0; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - } - - // Existing note construct - private WorkingNote(Context context, long noteId, long folderId) { - mContext = context; - mNoteId = noteId; - mFolderId = folderId; - mIsDeleted = false; - mNote = new Note(); - loadNote(); - } - - private void loadNote() { - Cursor cursor = mContext.getContentResolver().query( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, - null, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); - mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); - mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); - mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); - mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); - } - cursor.close(); - } else { - Log.e(TAG, "No note with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note with id " + mNoteId); - } - loadNoteData(); - } - - private void loadNoteData() { - Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, - DataColumns.NOTE_ID + "=?", new String[] { - String.valueOf(mNoteId) - }, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - do { - String type = cursor.getString(DATA_MIME_TYPE_COLUMN); - if (DataConstants.NOTE.equals(type)) { - mContent = cursor.getString(DATA_CONTENT_COLUMN); - mMode = cursor.getInt(DATA_MODE_COLUMN); - mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); - } else if (DataConstants.CALL_NOTE.equals(type)) { - mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); - } else { - Log.d(TAG, "Wrong note type with type:" + type); - } - } while (cursor.moveToNext()); - } - cursor.close(); - } else { - Log.e(TAG, "No data with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); - } - } - - public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, - int widgetType, int defaultBgColorId) { - WorkingNote note = new WorkingNote(context, folderId); - note.setBgColorId(defaultBgColorId); - note.setWidgetId(widgetId); - note.setWidgetType(widgetType); - return note; - } - - public static WorkingNote load(Context context, long id) { - return new WorkingNote(context, id, 0); - } - - public synchronized boolean saveNote() { - if (isWorthSaving()) { - if (!existInDatabase()) { - if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { - Log.e(TAG, "Create new note fail with id:" + mNoteId); - return false; - } - } - - mNote.syncNote(mContext, mNoteId); - - /** - * Update widget content if there exist any widget of this note - */ - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE - && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - return true; - } else { - return false; - } - } - - public boolean existInDatabase() { - return mNoteId > 0; - } - - private boolean isWorthSaving() { - if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) - || (existInDatabase() && !mNote.isLocalModified())) { - return false; - } else { - return true; - } - } - - public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { - mNoteSettingStatusListener = l; - } - - public void setAlertDate(long date, boolean set) { - if (date != mAlertDate) { - mAlertDate = date; - mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); - } - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onClockAlertChanged(date, set); - } - } - - public void markDeleted(boolean mark) { - mIsDeleted = mark; - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - } - - public void setBgColorId(int id) { - if (id != mBgColorId) { - mBgColorId = id; - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onBackgroundColorChanged(); - } - mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); - } - } - - public void setCheckListMode(int mode) { - if (mMode != mode) { - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); - } - mMode = mode; - mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); - } - } - - public void setWidgetType(int type) { - if (type != mWidgetType) { - mWidgetType = type; - mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); - } - } - - public void setWidgetId(int id) { - if (id != mWidgetId) { - mWidgetId = id; - mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); - } - } - - public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) { - mContent = text; - mNote.setTextData(DataColumns.CONTENT, mContent); - } - } - - public void convertToCallNote(String phoneNumber, long callDate) { - mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); - mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); - mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); - } - - public boolean hasClockAlert() { - return (mAlertDate > 0 ? true : false); - } - - public String getContent() { - return mContent; - } - - public long getAlertDate() { - return mAlertDate; - } - - public long getModifiedDate() { - return mModifiedDate; - } - - public int getBgColorResId() { - return NoteBgResources.getNoteBgResource(mBgColorId); - } - - public int getBgColorId() { - return mBgColorId; - } - - public int getTitleBgResId() { - return NoteBgResources.getNoteTitleBgResource(mBgColorId); - } - - public int getCheckListMode() { - return mMode; - } - - public long getNoteId() { - return mNoteId; - } - - public long getFolderId() { - return mFolderId; - } - - public int getWidgetId() { - return mWidgetId; - } - - public int getWidgetType() { - return mWidgetType; - } - - public interface NoteSettingChangedListener { - /** - * Called when the background color of current note has just changed - */ - void onBackgroundColorChanged(); - - /** - * Called when user set clock - */ - void onClockAlertChanged(long date, boolean set); - - /** - * Call when user create note from widget - */ - void onWidgetChanged(); - - /** - * Call when switch between check list mode and normal mode - * @param oldMode is previous mode before change - * @param newMode is new mode - */ - void onCheckListModeChanged(int oldMode, int newMode); - } -} diff --git a/doc/notes/tool/BackupUtils.java b/doc/notes/tool/BackupUtils.java deleted file mode 100644 index 39f6ec4..0000000 --- a/doc/notes/tool/BackupUtils.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.Context; -import android.database.Cursor; -import android.os.Environment; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; - - -public class BackupUtils { - private static final String TAG = "BackupUtils"; - // Singleton stuff - private static BackupUtils sInstance; - - public static synchronized BackupUtils getInstance(Context context) { - if (sInstance == null) { - sInstance = new BackupUtils(context); - } - return sInstance; - } - - /** - * Following states are signs to represents backup or restore - * status - */ - // Currently, the sdcard is not mounted - public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist - public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; - // The data is not well formated, may be changed by other programs - public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails - public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success - public static final int STATE_SUCCESS = 4; - - private TextExport mTextExport; - - private BackupUtils(Context context) { - mTextExport = new TextExport(context); - } - - private static boolean externalStorageAvailable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } - - public int exportToText() { - return mTextExport.exportToText(); - } - - public String getExportedTextFileName() { - return mTextExport.mFileName; - } - - public String getExportedTextFileDir() { - return mTextExport.mFileDirectory; - } - - private static class TextExport { - private static final String[] NOTE_PROJECTION = { - NoteColumns.ID, - NoteColumns.MODIFIED_DATE, - NoteColumns.SNIPPET, - NoteColumns.TYPE - }; - - private static final int NOTE_COLUMN_ID = 0; - - private static final int NOTE_COLUMN_MODIFIED_DATE = 1; - - private static final int NOTE_COLUMN_SNIPPET = 2; - - private static final String[] DATA_PROJECTION = { - DataColumns.CONTENT, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - private static final int DATA_COLUMN_CONTENT = 0; - - private static final int DATA_COLUMN_MIME_TYPE = 1; - - private static final int DATA_COLUMN_CALL_DATE = 2; - - private static final int DATA_COLUMN_PHONE_NUMBER = 4; - - private final String [] TEXT_FORMAT; - private static final int FORMAT_FOLDER_NAME = 0; - private static final int FORMAT_NOTE_DATE = 1; - private static final int FORMAT_NOTE_CONTENT = 2; - - private Context mContext; - private String mFileName; - private String mFileDirectory; - - public TextExport(Context context) { - TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); - mContext = context; - mFileName = ""; - mFileDirectory = ""; - } - - private String getFormat(int id) { - return TEXT_FORMAT[id]; - } - - /** - * Export the folder identified by folder id to text - */ - private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder - Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { - folderId - }, null); - - if (notesCursor != null) { - if (notesCursor.moveToFirst()) { - do { - // Print note's last modified date - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (notesCursor.moveToNext()); - } - notesCursor.close(); - } - } - - /** - * Export note identified by id to a print stream - */ - private void exportNoteToText(String noteId, PrintStream ps) { - Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, - DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { - noteId - }, null); - - if (dataCursor != null) { - if (dataCursor.moveToFirst()) { - do { - String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); - if (DataConstants.CALL_NOTE.equals(mimeType)) { - // Print phone number - String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); - long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); - String location = dataCursor.getString(DATA_COLUMN_CONTENT); - - if (!TextUtils.isEmpty(phoneNumber)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - phoneNumber)); - } - // Print call date - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat - .format(mContext.getString(R.string.format_datetime_mdhm), - callDate))); - // Print call attachment location - if (!TextUtils.isEmpty(location)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - location)); - } - } else if (DataConstants.NOTE.equals(mimeType)) { - String content = dataCursor.getString(DATA_COLUMN_CONTENT); - if (!TextUtils.isEmpty(content)) { - ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), - content)); - } - } - } while (dataCursor.moveToNext()); - } - dataCursor.close(); - } - // print a line separator between note - try { - ps.write(new byte[] { - Character.LINE_SEPARATOR, Character.LETTER_NUMBER - }); - } catch (IOException e) { - Log.e(TAG, e.toString()); - } - } - - /** - * Note will be exported as text which is user readable - */ - public int exportToText() { - if (!externalStorageAvailable()) { - Log.d(TAG, "Media was not mounted"); - return STATE_SD_CARD_UNMOUONTED; - } - - PrintStream ps = getExportToTextPrintStream(); - if (ps == null) { - Log.e(TAG, "get print stream error"); - return STATE_SYSTEM_ERROR; - } - // First export folder and its notes - Cursor folderCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " - + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); - - if (folderCursor != null) { - if (folderCursor.moveToFirst()) { - do { - // Print folder's name - String folderName = ""; - if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { - folderName = mContext.getString(R.string.call_record_folder_name); - } else { - folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); - } - if (!TextUtils.isEmpty(folderName)) { - ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); - } - String folderId = folderCursor.getString(NOTE_COLUMN_ID); - exportFolderToText(folderId, ps); - } while (folderCursor.moveToNext()); - } - folderCursor.close(); - } - - // Export notes in root's folder - Cursor noteCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID - + "=0", null, null); - - if (noteCursor != null) { - if (noteCursor.moveToFirst()) { - do { - ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( - mContext.getString(R.string.format_datetime_mdhm), - noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note - String noteId = noteCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); - } while (noteCursor.moveToNext()); - } - noteCursor.close(); - } - ps.close(); - - return STATE_SUCCESS; - } - - /** - * Get a print stream pointed to the file {@generateExportedTextFile} - */ - private PrintStream getExportToTextPrintStream() { - File file = generateFileMountedOnSDcard(mContext, R.string.file_path, - R.string.file_name_txt_format); - if (file == null) { - Log.e(TAG, "create file to exported failed"); - return null; - } - mFileName = file.getName(); - mFileDirectory = mContext.getString(R.string.file_path); - PrintStream ps = null; - try { - FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } catch (NullPointerException e) { - e.printStackTrace(); - return null; - } - return ps; - } - } - - /** - * Generate the text file to store imported data - */ - private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { - StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); - sb.append(context.getString(filePathResId)); - File filedir = new File(sb.toString()); - sb.append(context.getString( - fileNameFormatResId, - DateFormat.format(context.getString(R.string.format_date_ymd), - System.currentTimeMillis()))); - File file = new File(sb.toString()); - - try { - if (!filedir.exists()) { - filedir.mkdir(); - } - if (!file.exists()) { - file.createNewFile(); - } - return file; - } catch (SecurityException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } -} - - diff --git a/doc/notes/tool/DataUtils.java b/doc/notes/tool/DataUtils.java deleted file mode 100644 index 2a14982..0000000 --- a/doc/notes/tool/DataUtils.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.OperationApplicationException; -import android.database.Cursor; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; - -import java.util.ArrayList; -import java.util.HashSet; - - -public class DataUtils { - public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - if (ids.size() == 0) { - Log.d(TAG, "no id is in the hashset"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Don't delete system folder root"); - continue; - } - ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - operationList.add(builder.build()); - } - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.PARENT_ID, desFolderId); - values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); - } - - public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - builder.withValue(NoteColumns.PARENT_ID, folderId); - builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); - operationList.add(builder.build()); - } - - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} - */ - public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { "COUNT(*)" }, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); - - int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { - try { - count = cursor.getInt(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "get folder count failed:" + e.toString()); - } finally { - cursor.close(); - } - } - } - return count; - } - - public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, - null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, - NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); - boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { - Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, - NoteColumns.PARENT_ID + "=?", - new String[] { String.valueOf(folderId) }, - null); - - HashSet set = null; - if (c != null) { - if (c.moveToFirst()) { - set = new HashSet(); - do { - try { - AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); - widget.widgetType = c.getInt(1); - set.add(widget); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, e.toString()); - } - } while (c.moveToNext()); - } - c.close(); - } - return set; - } - - public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, - CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, - null); - - if (cursor != null && cursor.moveToFirst()) { - try { - return cursor.getString(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); - } finally { - cursor.close(); - } - } - return ""; - } - - public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, - CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, - null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - try { - return cursor.getLong(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call note id fails " + e.toString()); - } - } - cursor.close(); - } - return 0; - } - - public static String getSnippetById(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, - NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, - null); - - if (cursor != null) { - String snippet = ""; - if (cursor.moveToFirst()) { - snippet = cursor.getString(0); - } - cursor.close(); - return snippet; - } - throw new IllegalArgumentException("Note is not found with id: " + noteId); - } - - public static String getFormattedSnippet(String snippet) { - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); - if (index != -1) { - snippet = snippet.substring(0, index); - } - } - return snippet; - } -} diff --git a/doc/notes/tool/GTaskStringUtils.java b/doc/notes/tool/GTaskStringUtils.java deleted file mode 100644 index 666b729..0000000 --- a/doc/notes/tool/GTaskStringUtils.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -public class GTaskStringUtils { - - public final static String GTASK_JSON_ACTION_ID = "action_id"; - - public final static String GTASK_JSON_ACTION_LIST = "action_list"; - - public final static String GTASK_JSON_ACTION_TYPE = "action_type"; - - public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; - - public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; - - public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; - - public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; - - public final static String GTASK_JSON_CREATOR_ID = "creator_id"; - - public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; - - public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; - - public final static String GTASK_JSON_COMPLETED = "completed"; - - public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; - - public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; - - public final static String GTASK_JSON_DELETED = "deleted"; - - public final static String GTASK_JSON_DEST_LIST = "dest_list"; - - public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; - - public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; - - public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; - - public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; - - public final static String GTASK_JSON_GET_DELETED = "get_deleted"; - - public final static String GTASK_JSON_ID = "id"; - - public final static String GTASK_JSON_INDEX = "index"; - - public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; - - public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; - - public final static String GTASK_JSON_LIST_ID = "list_id"; - - public final static String GTASK_JSON_LISTS = "lists"; - - public final static String GTASK_JSON_NAME = "name"; - - public final static String GTASK_JSON_NEW_ID = "new_id"; - - public final static String GTASK_JSON_NOTES = "notes"; - - public final static String GTASK_JSON_PARENT_ID = "parent_id"; - - public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; - - public final static String GTASK_JSON_RESULTS = "results"; - - public final static String GTASK_JSON_SOURCE_LIST = "source_list"; - - public final static String GTASK_JSON_TASKS = "tasks"; - - public final static String GTASK_JSON_TYPE = "type"; - - public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; - - public final static String GTASK_JSON_TYPE_TASK = "TASK"; - - public final static String GTASK_JSON_USER = "user"; - - public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; - - public final static String FOLDER_DEFAULT = "Default"; - - public final static String FOLDER_CALL_NOTE = "Call_Note"; - - public final static String FOLDER_META = "METADATA"; - - public final static String META_HEAD_GTASK_ID = "meta_gid"; - - public final static String META_HEAD_NOTE = "meta_note"; - - public final static String META_HEAD_DATA = "meta_data"; - - public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; - -} diff --git a/doc/notes/tool/ResourceParser.java b/doc/notes/tool/ResourceParser.java deleted file mode 100644 index 1ad3ad6..0000000 --- a/doc/notes/tool/ResourceParser.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.Context; -import android.preference.PreferenceManager; - -import net.micode.notes.R; -import net.micode.notes.ui.NotesPreferenceActivity; - -public class ResourceParser { - - public static final int YELLOW = 0; - public static final int BLUE = 1; - public static final int WHITE = 2; - public static final int GREEN = 3; - public static final int RED = 4; - - public static final int BG_DEFAULT_COLOR = YELLOW; - - public static final int TEXT_SMALL = 0; - public static final int TEXT_MEDIUM = 1; - public static final int TEXT_LARGE = 2; - public static final int TEXT_SUPER = 3; - - public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; - - public static class NoteBgResources { - private final static int [] BG_EDIT_RESOURCES = new int [] { - R.drawable.edit_yellow, - R.drawable.edit_blue, - R.drawable.edit_white, - R.drawable.edit_green, - R.drawable.edit_red - }; - - private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { - R.drawable.edit_title_yellow, - R.drawable.edit_title_blue, - R.drawable.edit_title_white, - R.drawable.edit_title_green, - R.drawable.edit_title_red - }; - - public static int getNoteBgResource(int id) { - return BG_EDIT_RESOURCES[id]; - } - - public static int getNoteTitleBgResource(int id) { - return BG_EDIT_TITLE_RESOURCES[id]; - } - } - - public static int getDefaultBgId(Context context) { - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { - return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); - } else { - return BG_DEFAULT_COLOR; - } - } - - public static class NoteItemBgResources { - private final static int [] BG_FIRST_RESOURCES = new int [] { - R.drawable.list_yellow_up, - R.drawable.list_blue_up, - R.drawable.list_white_up, - R.drawable.list_green_up, - R.drawable.list_red_up - }; - - private final static int [] BG_NORMAL_RESOURCES = new int [] { - R.drawable.list_yellow_middle, - R.drawable.list_blue_middle, - R.drawable.list_white_middle, - R.drawable.list_green_middle, - R.drawable.list_red_middle - }; - - private final static int [] BG_LAST_RESOURCES = new int [] { - R.drawable.list_yellow_down, - R.drawable.list_blue_down, - R.drawable.list_white_down, - R.drawable.list_green_down, - R.drawable.list_red_down, - }; - - private final static int [] BG_SINGLE_RESOURCES = new int [] { - R.drawable.list_yellow_single, - R.drawable.list_blue_single, - R.drawable.list_white_single, - R.drawable.list_green_single, - R.drawable.list_red_single - }; - - public static int getNoteBgFirstRes(int id) { - return BG_FIRST_RESOURCES[id]; - } - - public static int getNoteBgLastRes(int id) { - return BG_LAST_RESOURCES[id]; - } - - public static int getNoteBgSingleRes(int id) { - return BG_SINGLE_RESOURCES[id]; - } - - public static int getNoteBgNormalRes(int id) { - return BG_NORMAL_RESOURCES[id]; - } - - public static int getFolderBgRes() { - return R.drawable.list_folder; - } - } - - public static class WidgetBgResources { - private final static int [] BG_2X_RESOURCES = new int [] { - R.drawable.widget_2x_yellow, - R.drawable.widget_2x_blue, - R.drawable.widget_2x_white, - R.drawable.widget_2x_green, - R.drawable.widget_2x_red, - }; - - public static int getWidget2xBgResource(int id) { - return BG_2X_RESOURCES[id]; - } - - private final static int [] BG_4X_RESOURCES = new int [] { - R.drawable.widget_4x_yellow, - R.drawable.widget_4x_blue, - R.drawable.widget_4x_white, - R.drawable.widget_4x_green, - R.drawable.widget_4x_red - }; - - public static int getWidget4xBgResource(int id) { - return BG_4X_RESOURCES[id]; - } - } - - public static class TextAppearanceResources { - private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { - R.style.TextAppearanceNormal, - R.style.TextAppearanceMedium, - R.style.TextAppearanceLarge, - R.style.TextAppearanceSuper - }; - - public static int getTexAppearanceResource(int id) { - /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} - */ - if (id >= TEXTAPPEARANCE_RESOURCES.length) { - return BG_DEFAULT_FONT_SIZE; - } - return TEXTAPPEARANCE_RESOURCES[id]; - } - - public static int getResourcesSize() { - return TEXTAPPEARANCE_RESOURCES.length; - } - } -} diff --git a/doc/notes/ui/AlarmAlertActivity.java b/doc/notes/ui/AlarmAlertActivity.java deleted file mode 100644 index 85723be..0000000 --- a/doc/notes/ui/AlarmAlertActivity.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.DialogInterface.OnDismissListener; -import android.content.Intent; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Bundle; -import android.os.PowerManager; -import android.provider.Settings; -import android.view.Window; -import android.view.WindowManager; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.DataUtils; - -import java.io.IOException; - - -public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - - final Window win = getWindow(); - win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - - if (!isScreenOn()) { - win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON - | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - - Intent intent = getIntent(); - - try { - mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); - mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); - mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, - SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) - : mSnippet; - } catch (IllegalArgumentException e) { - e.printStackTrace(); - return; - } - - mPlayer = new MediaPlayer(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - showActionDialog(); - playAlarmSound(); - } else { - finish(); - } - } - - private boolean isScreenOn() { - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - private void playAlarmSound() { - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - - int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - - if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { - mPlayer.setAudioStreamType(silentModeStreams); - } else { - mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); - } - try { - mPlayer.setDataSource(this, url); - mPlayer.prepare(); - mPlayer.setLooping(true); - mPlayer.start(); - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalStateException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - private void showActionDialog() { - AlertDialog.Builder dialog = new AlertDialog.Builder(this); - dialog.setTitle(R.string.app_name); - dialog.setMessage(mSnippet); - dialog.setPositiveButton(R.string.notealert_ok, this); - if (isScreenOn()) { - dialog.setNegativeButton(R.string.notealert_enter, this); - } - dialog.show().setOnDismissListener(this); - } - - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_NEGATIVE: - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, mNoteId); - startActivity(intent); - break; - default: - break; - } - } - - public void onDismiss(DialogInterface dialog) { - stopAlarmSound(); - finish(); - } - - private void stopAlarmSound() { - if (mPlayer != null) { - mPlayer.stop(); - mPlayer.release(); - mPlayer = null; - } - } -} diff --git a/doc/notes/ui/AlarmInitReceiver.java b/doc/notes/ui/AlarmInitReceiver.java deleted file mode 100644 index f221202..0000000 --- a/doc/notes/ui/AlarmInitReceiver.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - - -public class AlarmInitReceiver extends BroadcastReceiver { - - private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE - }; - - private static final int COLUMN_ID = 0; - private static final int COLUMN_ALERTED_DATE = 1; - - @Override - public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); - Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, - new String[] { String.valueOf(currentDate) }, - null); - - if (c != null) { - if (c.moveToFirst()) { - do { - long alertDate = c.getLong(COLUMN_ALERTED_DATE); - Intent sender = new Intent(context, AlarmReceiver.class); - sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); - AlarmManager alermManager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); - } while (c.moveToNext()); - } - c.close(); - } - } -} diff --git a/doc/notes/ui/AlarmReceiver.java b/doc/notes/ui/AlarmReceiver.java deleted file mode 100644 index 54e503b..0000000 --- a/doc/notes/ui/AlarmReceiver.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -public class AlarmReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } -} diff --git a/doc/notes/ui/DateTimePicker.java b/doc/notes/ui/DateTimePicker.java deleted file mode 100644 index 496b0cd..0000000 --- a/doc/notes/ui/DateTimePicker.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import java.text.DateFormatSymbols; -import java.util.Calendar; - -import net.micode.notes.R; - - -import android.content.Context; -import android.text.format.DateFormat; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.NumberPicker; - -public class DateTimePicker extends FrameLayout { - - private static final boolean DEFAULT_ENABLE_STATE = true; - - private static final int HOURS_IN_HALF_DAY = 12; - private static final int HOURS_IN_ALL_DAY = 24; - private static final int DAYS_IN_ALL_WEEK = 7; - private static final int DATE_SPINNER_MIN_VAL = 0; - private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; - private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; - private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; - private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; - private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; - private static final int MINUT_SPINNER_MIN_VAL = 0; - private static final int MINUT_SPINNER_MAX_VAL = 59; - private static final int AMPM_SPINNER_MIN_VAL = 0; - private static final int AMPM_SPINNER_MAX_VAL = 1; - - private final NumberPicker mDateSpinner; - private final NumberPicker mHourSpinner; - private final NumberPicker mMinuteSpinner; - private final NumberPicker mAmPmSpinner; - private Calendar mDate; - - private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - - private boolean mIsAm; - - private boolean mIs24HourView; - - private boolean mIsEnabled = DEFAULT_ENABLE_STATE; - - private boolean mInitialising; - - private OnDateTimeChangedListener mOnDateTimeChangedListener; - - private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); - updateDateControl(); - onDateTimeChanged(); - } - }; - - private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - boolean isDateChanged = false; - Calendar cal = Calendar.getInstance(); - if (!mIs24HourView) { - if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || - oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - mIsAm = !mIsAm; - updateAmPmControl(); - } - } else { - if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - } - int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); - mDate.set(Calendar.HOUR_OF_DAY, newHour); - onDateTimeChanged(); - if (isDateChanged) { - setCurrentYear(cal.get(Calendar.YEAR)); - setCurrentMonth(cal.get(Calendar.MONTH)); - setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); - } - } - }; - - private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - int minValue = mMinuteSpinner.getMinValue(); - int maxValue = mMinuteSpinner.getMaxValue(); - int offset = 0; - if (oldVal == maxValue && newVal == minValue) { - offset += 1; - } else if (oldVal == minValue && newVal == maxValue) { - offset -= 1; - } - if (offset != 0) { - mDate.add(Calendar.HOUR_OF_DAY, offset); - mHourSpinner.setValue(getCurrentHour()); - updateDateControl(); - int newHour = getCurrentHourOfDay(); - if (newHour >= HOURS_IN_HALF_DAY) { - mIsAm = false; - updateAmPmControl(); - } else { - mIsAm = true; - updateAmPmControl(); - } - } - mDate.set(Calendar.MINUTE, newVal); - onDateTimeChanged(); - } - }; - - private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mIsAm = !mIsAm; - if (mIsAm) { - mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); - } else { - mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); - } - updateAmPmControl(); - onDateTimeChanged(); - } - }; - - public interface OnDateTimeChangedListener { - void onDateTimeChanged(DateTimePicker view, int year, int month, - int dayOfMonth, int hourOfDay, int minute); - } - - public DateTimePicker(Context context) { - this(context, System.currentTimeMillis()); - } - - public DateTimePicker(Context context, long date) { - this(context, date, DateFormat.is24HourFormat(context)); - } - - public DateTimePicker(Context context, long date, boolean is24HourView) { - super(context); - mDate = Calendar.getInstance(); - mInitialising = true; - mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; - inflate(context, R.layout.datetime_picker, this); - - mDateSpinner = (NumberPicker) findViewById(R.id.date); - mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); - mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); - mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); - - mHourSpinner = (NumberPicker) findViewById(R.id.hour); - mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); - mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); - mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); - mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); - mMinuteSpinner.setOnLongPressUpdateInterval(100); - mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); - - String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); - mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); - mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); - mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); - mAmPmSpinner.setDisplayedValues(stringsForAmPm); - mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - - // update controls to initial state - updateDateControl(); - updateHourControl(); - updateAmPmControl(); - - set24HourView(is24HourView); - - // set to current time - setCurrentDate(date); - - setEnabled(isEnabled()); - - // set the content descriptions - mInitialising = false; - } - - @Override - public void setEnabled(boolean enabled) { - if (mIsEnabled == enabled) { - return; - } - super.setEnabled(enabled); - mDateSpinner.setEnabled(enabled); - mMinuteSpinner.setEnabled(enabled); - mHourSpinner.setEnabled(enabled); - mAmPmSpinner.setEnabled(enabled); - mIsEnabled = enabled; - } - - @Override - public boolean isEnabled() { - return mIsEnabled; - } - - /** - * Get the current date in millis - * - * @return the current date in millis - */ - public long getCurrentDateInTimeMillis() { - return mDate.getTimeInMillis(); - } - - /** - * Set the current date - * - * @param date The current date in millis - */ - public void setCurrentDate(long date) { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(date); - setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), - cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } - - /** - * Set the current date - * - * @param year The current year - * @param month The current month - * @param dayOfMonth The current dayOfMonth - * @param hourOfDay The current hourOfDay - * @param minute The current minute - */ - public void setCurrentDate(int year, int month, - int dayOfMonth, int hourOfDay, int minute) { - setCurrentYear(year); - setCurrentMonth(month); - setCurrentDay(dayOfMonth); - setCurrentHour(hourOfDay); - setCurrentMinute(minute); - } - - /** - * Get current year - * - * @return The current year - */ - public int getCurrentYear() { - return mDate.get(Calendar.YEAR); - } - - /** - * Set current year - * - * @param year The current year - */ - public void setCurrentYear(int year) { - if (!mInitialising && year == getCurrentYear()) { - return; - } - mDate.set(Calendar.YEAR, year); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current month in the year - * - * @return The current month in the year - */ - public int getCurrentMonth() { - return mDate.get(Calendar.MONTH); - } - - /** - * Set current month in the year - * - * @param month The month in the year - */ - public void setCurrentMonth(int month) { - if (!mInitialising && month == getCurrentMonth()) { - return; - } - mDate.set(Calendar.MONTH, month); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current day of the month - * - * @return The day of the month - */ - public int getCurrentDay() { - return mDate.get(Calendar.DAY_OF_MONTH); - } - - /** - * Set current day of the month - * - * @param dayOfMonth The day of the month - */ - public void setCurrentDay(int dayOfMonth) { - if (!mInitialising && dayOfMonth == getCurrentDay()) { - return; - } - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current hour in 24 hour mode, in the range (0~23) - * @return The current hour in 24 hour mode - */ - public int getCurrentHourOfDay() { - return mDate.get(Calendar.HOUR_OF_DAY); - } - - private int getCurrentHour() { - if (mIs24HourView){ - return getCurrentHourOfDay(); - } else { - int hour = getCurrentHourOfDay(); - if (hour > HOURS_IN_HALF_DAY) { - return hour - HOURS_IN_HALF_DAY; - } else { - return hour == 0 ? HOURS_IN_HALF_DAY : hour; - } - } - } - - /** - * Set current hour in 24 hour mode, in the range (0~23) - * - * @param hourOfDay - */ - public void setCurrentHour(int hourOfDay) { - if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { - return; - } - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - if (!mIs24HourView) { - if (hourOfDay >= HOURS_IN_HALF_DAY) { - mIsAm = false; - if (hourOfDay > HOURS_IN_HALF_DAY) { - hourOfDay -= HOURS_IN_HALF_DAY; - } - } else { - mIsAm = true; - if (hourOfDay == 0) { - hourOfDay = HOURS_IN_HALF_DAY; - } - } - updateAmPmControl(); - } - mHourSpinner.setValue(hourOfDay); - onDateTimeChanged(); - } - - /** - * Get currentMinute - * - * @return The Current Minute - */ - public int getCurrentMinute() { - return mDate.get(Calendar.MINUTE); - } - - /** - * Set current minute - */ - public void setCurrentMinute(int minute) { - if (!mInitialising && minute == getCurrentMinute()) { - return; - } - mMinuteSpinner.setValue(minute); - mDate.set(Calendar.MINUTE, minute); - onDateTimeChanged(); - } - - /** - * @return true if this is in 24 hour view else false. - */ - public boolean is24HourView () { - return mIs24HourView; - } - - /** - * Set whether in 24 hour or AM/PM mode. - * - * @param is24HourView True for 24 hour mode. False for AM/PM mode. - */ - public void set24HourView(boolean is24HourView) { - if (mIs24HourView == is24HourView) { - return; - } - mIs24HourView = is24HourView; - mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); - int hour = getCurrentHourOfDay(); - updateHourControl(); - setCurrentHour(hour); - updateAmPmControl(); - } - - private void updateDateControl() { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); - mDateSpinner.setDisplayedValues(null); - for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { - cal.add(Calendar.DAY_OF_YEAR, 1); - mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); - } - mDateSpinner.setDisplayedValues(mDateDisplayValues); - mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); - mDateSpinner.invalidate(); - } - - private void updateAmPmControl() { - if (mIs24HourView) { - mAmPmSpinner.setVisibility(View.GONE); - } else { - int index = mIsAm ? Calendar.AM : Calendar.PM; - mAmPmSpinner.setValue(index); - mAmPmSpinner.setVisibility(View.VISIBLE); - } - } - - private void updateHourControl() { - if (mIs24HourView) { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); - } else { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } - } - - /** - * Set the callback that indicates the 'Set' button has been pressed. - * @param callback the callback, if null will do nothing - */ - public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { - mOnDateTimeChangedListener = callback; - } - - private void onDateTimeChanged() { - if (mOnDateTimeChangedListener != null) { - mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), - getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); - } - } -} diff --git a/doc/notes/ui/DateTimePickerDialog.java b/doc/notes/ui/DateTimePickerDialog.java deleted file mode 100644 index 2c47ba4..0000000 --- a/doc/notes/ui/DateTimePickerDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import java.util.Calendar; - -import net.micode.notes.R; -import net.micode.notes.ui.DateTimePicker; -import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.text.format.DateFormat; -import android.text.format.DateUtils; - -public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - - private Calendar mDate = Calendar.getInstance(); - private boolean mIs24HourView; - private OnDateTimeSetListener mOnDateTimeSetListener; - private DateTimePicker mDateTimePicker; - - public interface OnDateTimeSetListener { - void OnDateTimeSet(AlertDialog dialog, long date); - } - - public DateTimePickerDialog(Context context, long date) { - super(context); - mDateTimePicker = new DateTimePicker(context); - setView(mDateTimePicker); - mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { - public void onDateTimeChanged(DateTimePicker view, int year, int month, - int dayOfMonth, int hourOfDay, int minute) { - mDate.set(Calendar.YEAR, year); - mDate.set(Calendar.MONTH, month); - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - mDate.set(Calendar.MINUTE, minute); - updateTitle(mDate.getTimeInMillis()); - } - }); - mDate.setTimeInMillis(date); - mDate.set(Calendar.SECOND, 0); - mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); - setButton(context.getString(R.string.datetime_dialog_ok), this); - setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); - set24HourView(DateFormat.is24HourFormat(this.getContext())); - updateTitle(mDate.getTimeInMillis()); - } - - public void set24HourView(boolean is24HourView) { - mIs24HourView = is24HourView; - } - - public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { - mOnDateTimeSetListener = callBack; - } - - private void updateTitle(long date) { - int flag = - DateUtils.FORMAT_SHOW_YEAR | - DateUtils.FORMAT_SHOW_DATE | - DateUtils.FORMAT_SHOW_TIME; - flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; - setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } - - public void onClick(DialogInterface arg0, int arg1) { - if (mOnDateTimeSetListener != null) { - mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); - } - } - -} \ No newline at end of file diff --git a/doc/notes/ui/DropdownMenu.java b/doc/notes/ui/DropdownMenu.java deleted file mode 100644 index 613dc74..0000000 --- a/doc/notes/ui/DropdownMenu.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.PopupMenu; -import android.widget.PopupMenu.OnMenuItemClickListener; - -import net.micode.notes.R; - -public class DropdownMenu { - private Button mButton; - private PopupMenu mPopupMenu; - private Menu mMenu; - - public DropdownMenu(Context context, Button button, int menuId) { - mButton = button; - mButton.setBackgroundResource(R.drawable.dropdown_icon); - mPopupMenu = new PopupMenu(context, mButton); - mMenu = mPopupMenu.getMenu(); - mPopupMenu.getMenuInflater().inflate(menuId, mMenu); - mButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - mPopupMenu.show(); - } - }); - } - - public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { - if (mPopupMenu != null) { - mPopupMenu.setOnMenuItemClickListener(listener); - } - } - - public MenuItem findItem(int id) { - return mMenu.findItem(id); - } - - public void setTitle(CharSequence title) { - mButton.setText(title); - } -} diff --git a/doc/notes/ui/FoldersListAdapter.java b/doc/notes/ui/FoldersListAdapter.java deleted file mode 100644 index 96b77da..0000000 --- a/doc/notes/ui/FoldersListAdapter.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - - -public class FoldersListAdapter extends CursorAdapter { - public static final String [] PROJECTION = { - NoteColumns.ID, - NoteColumns.SNIPPET - }; - - public static final int ID_COLUMN = 0; - public static final int NAME_COLUMN = 1; - - public FoldersListAdapter(Context context, Cursor c) { - super(context, c); - // TODO Auto-generated constructor stub - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new FolderListItem(context); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof FolderListItem) { - String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - ((FolderListItem) view).bind(folderName); - } - } - - public String getFolderName(Context context, int position) { - Cursor cursor = (Cursor) getItem(position); - return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - } - - private class FolderListItem extends LinearLayout { - private TextView mName; - - public FolderListItem(Context context) { - super(context); - inflate(context, R.layout.folder_list_item, this); - mName = (TextView) findViewById(R.id.tv_folder_name); - } - - public void bind(String name) { - mName.setText(name); - } - } - -} diff --git a/doc/notes/ui/NoteEditActivity.java b/doc/notes/ui/NoteEditActivity.java deleted file mode 100644 index 96a9ff8..0000000 --- a/doc/notes/ui/NoteEditActivity.java +++ /dev/null @@ -1,873 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlarmManager; -import android.app.AlertDialog; -import android.app.PendingIntent; -import android.app.SearchManager; -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Paint; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.style.BackgroundColorSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.tool.ResourceParser.TextAppearanceResources; -import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; -import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener { - private class HeadViewHolder { - public TextView tvModified; - - public ImageView ivAlertIcon; - - public TextView tvAlertDate; - - public ImageView ibSetBgColor; - } - - private static final Map sBgSelectorBtnsMap = new HashMap(); - static { - sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); - sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); - sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); - sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); - sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); - } - - private static final Map sBgSelectorSelectionMap = new HashMap(); - static { - sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); - sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); - sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); - sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); - sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); - } - - private static final Map sFontSizeBtnsMap = new HashMap(); - static { - sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); - sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); - sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); - sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); - } - - private static final Map sFontSelectorSelectionMap = new HashMap(); - static { - sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); - } - - private static final String TAG = "NoteEditActivity"; - - private HeadViewHolder mNoteHeaderHolder; - - private View mHeadViewPanel; - - private View mNoteBgColorSelector; - - private View mFontSizeSelector; - - private EditText mNoteEditor; - - private View mNoteEditorPanel; - - private WorkingNote mWorkingNote; - - private SharedPreferences mSharedPrefs; - private int mFontSizeId; - - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; - - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; - - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); - - private LinearLayout mEditTextList; - - private String mUserQuery; - private Pattern mPattern; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - this.setContentView(R.layout.note_edit); - - if (savedInstanceState == null && !initActivityState(getIntent())) { - finish(); - return; - } - initResources(); - } - - /** - * Current activity may be killed when the memory is low. Once it is killed, for another time - * user load this activity, we should restore the former state - */ - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); - if (!initActivityState(intent)) { - finish(); - return; - } - Log.d(TAG, "Restoring from killed activity"); - } - } - - private boolean initActivityState(Intent intent) { - /** - * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, - * then jump to the NotesListActivity - */ - mWorkingNote = null; - if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { - long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); - mUserQuery = ""; - - /** - * Starting from the searched result - */ - if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { - noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); - mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); - } - - if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { - Intent jump = new Intent(this, NotesListActivity.class); - startActivity(jump); - showToast(R.string.error_note_not_exist); - finish(); - return false; - } else { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load note failed with note id" + noteId); - finish(); - return false; - } - } - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { - // New note - long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); - int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); - int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, - Notes.TYPE_WIDGET_INVALIDE); - int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, - ResourceParser.getDefaultBgId(this)); - - // Parse call-record note - String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); - long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); - if (callDate != 0 && phoneNumber != null) { - if (TextUtils.isEmpty(phoneNumber)) { - Log.w(TAG, "The call record number is null"); - } - long noteId = 0; - if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), - phoneNumber, callDate)) > 0) { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load call note failed with note id" + noteId); - finish(); - return false; - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, - widgetType, bgResId); - mWorkingNote.convertToCallNote(phoneNumber, callDate); - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, - bgResId); - } - - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE - | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - } else { - Log.e(TAG, "Intent not specified action, should not support"); - finish(); - return false; - } - mWorkingNote.setOnSettingStatusChangedListener(this); - return true; - } - - @Override - protected void onResume() { - super.onResume(); - initNoteScreen(); - } - - private void initNoteScreen() { - mNoteEditor.setTextAppearance(this, TextAppearanceResources - .getTexAppearanceResource(mFontSizeId)); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mNoteEditor.setSelection(mNoteEditor.getText().length()); - } - for (Integer id : sBgSelectorSelectionMap.keySet()) { - findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); - } - mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); - mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - - mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, - mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE - | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME - | DateUtils.FORMAT_SHOW_YEAR)); - - /** - * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker - * is not ready - */ - showAlertHeader(); - } - - private void showAlertHeader() { - if (mWorkingNote.hasClockAlert()) { - long time = System.currentTimeMillis(); - if (time > mWorkingNote.getAlertDate()) { - mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); - } else { - mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( - mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); - } - mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); - } else { - mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); - }; - } - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - initActivityState(intent); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - /** - * For new note without note id, we should firstly save it to - * generate a id. If the editing note is not worth saving, there - * is no id which is equivalent to create new note - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent ev) { - if (mNoteBgColorSelector.getVisibility() == View.VISIBLE - && !inRangeOfView(mNoteBgColorSelector, ev)) { - mNoteBgColorSelector.setVisibility(View.GONE); - return true; - } - - if (mFontSizeSelector.getVisibility() == View.VISIBLE - && !inRangeOfView(mFontSizeSelector, ev)) { - mFontSizeSelector.setVisibility(View.GONE); - return true; - } - return super.dispatchTouchEvent(ev); - } - - private boolean inRangeOfView(View view, MotionEvent ev) { - int []location = new int[2]; - view.getLocationOnScreen(location); - int x = location[0]; - int y = location[1]; - if (ev.getX() < x - || ev.getX() > (x + view.getWidth()) - || ev.getY() < y - || ev.getY() > (y + view.getHeight())) { - return false; - } - return true; - } - - private void initResources() { - mHeadViewPanel = findViewById(R.id.note_title); - mNoteHeaderHolder = new HeadViewHolder(); - mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); - mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon); - mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); - mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); - mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); - mNoteEditor = (EditText) findViewById(R.id.note_edit_view); - mNoteEditorPanel = findViewById(R.id.sv_note_edit); - mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); - for (int id : sBgSelectorBtnsMap.keySet()) { - ImageView iv = (ImageView) findViewById(id); - iv.setOnClickListener(this); - } - - mFontSizeSelector = findViewById(R.id.font_size_selector); - for (int id : sFontSizeBtnsMap.keySet()) { - View view = findViewById(id); - view.setOnClickListener(this); - }; - mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); - mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); - /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} - */ - if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { - mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; - } - mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); - } - - @Override - protected void onPause() { - super.onPause(); - if(saveNote()) { - Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); - } - clearSettingState(); - } - - private void updateWidget() { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - mWorkingNote.getWidgetId() - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); - } - - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.btn_set_bg_color) { - mNoteBgColorSelector.setVisibility(View.VISIBLE); - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - - View.VISIBLE); - } else if (sBgSelectorBtnsMap.containsKey(id)) { - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - View.GONE); - mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); - mNoteBgColorSelector.setVisibility(View.GONE); - } else if (sFontSizeBtnsMap.containsKey(id)) { - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); - mFontSizeId = sFontSizeBtnsMap.get(id); - mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - getWorkingText(); - switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setTextAppearance(this, - TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - } - mFontSizeSelector.setVisibility(View.GONE); - } - } - - @Override - public void onBackPressed() { - if(clearSettingState()) { - return; - } - - saveNote(); - super.onBackPressed(); - } - - private boolean clearSettingState() { - if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { - mNoteBgColorSelector.setVisibility(View.GONE); - return true; - } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { - mFontSizeSelector.setVisibility(View.GONE); - return true; - } - return false; - } - - public void onBackgroundColorChanged() { - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - View.VISIBLE); - mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - if (isFinishing()) { - return true; - } - clearSettingState(); - menu.clear(); - if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_note_edit, menu); - } else { - getMenuInflater().inflate(R.menu.note_edit, menu); - } - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); - } else { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); - } - if (mWorkingNote.hasClockAlert()) { - menu.findItem(R.id.menu_alert).setVisible(false); - } else { - menu.findItem(R.id.menu_delete_remind).setVisible(false); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_new_note: - createNewNote(); - break; - case R.id.menu_delete: - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_note)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteCurrentNote(); - finish(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case R.id.menu_font_size: - mFontSizeSelector.setVisibility(View.VISIBLE); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - break; - case R.id.menu_list_mode: - mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? - TextNote.MODE_CHECK_LIST : 0); - break; - case R.id.menu_share: - getWorkingText(); - sendTo(this, mWorkingNote.getContent()); - break; - case R.id.menu_send_to_desktop: - sendToDesktop(); - break; - case R.id.menu_alert: - setReminder(); - break; - case R.id.menu_delete_remind: - mWorkingNote.setAlertDate(0, false); - break; - default: - break; - } - return true; - } - - private void setReminder() { - DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); - d.setOnDateTimeSetListener(new OnDateTimeSetListener() { - public void OnDateTimeSet(AlertDialog dialog, long date) { - mWorkingNote.setAlertDate(date , true); - } - }); - d.show(); - } - - /** - * Share note to apps that support {@link Intent#ACTION_SEND} action - * and {@text/plain} type - */ - private void sendTo(Context context, String info) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, info); - intent.setType("text/plain"); - context.startActivity(intent); - } - - private void createNewNote() { - // Firstly, save current editing notes - saveNote(); - - // For safety, start a new NoteEditActivity - finish(); - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); - startActivity(intent); - } - - private void deleteCurrentNote() { - if (mWorkingNote.existInDatabase()) { - HashSet ids = new HashSet(); - long id = mWorkingNote.getNoteId(); - if (id != Notes.ID_ROOT_FOLDER) { - ids.add(id); - } else { - Log.d(TAG, "Wrong note id, should not happen"); - } - if (!isSyncMode()) { - if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { - Log.e(TAG, "Delete Note error"); - } - } else { - if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - } - mWorkingNote.markDeleted(true); - } - - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - - public void onClockAlertChanged(long date, boolean set) { - /** - * User could set clock to an unsaved note, so before setting the - * alert clock, we should save the note first - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - if (mWorkingNote.getNoteId() > 0) { - Intent intent = new Intent(this, AlarmReceiver.class); - intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); - PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); - AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); - showAlertHeader(); - if(!set) { - alarmManager.cancel(pendingIntent); - } else { - alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); - } - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Clock alert setting error"); - showToast(R.string.error_note_empty_for_clock); - } - } - - public void onWidgetChanged() { - updateWidget(); - } - - public void onEditTextDelete(int index, String text) { - int childCount = mEditTextList.getChildCount(); - if (childCount == 1) { - return; - } - - for (int i = index + 1; i < childCount; i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i - 1); - } - - mEditTextList.removeViewAt(index); - NoteEditText edit = null; - if(index == 0) { - edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( - R.id.et_edit_text); - } else { - edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( - R.id.et_edit_text); - } - int length = edit.length(); - edit.append(text); - edit.requestFocus(); - edit.setSelection(length); - } - - public void onEditTextEnter(int index, String text) { - /** - * Should not happen, check for debug - */ - if(index > mEditTextList.getChildCount()) { - Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); - } - - View view = getListItem(text, index); - mEditTextList.addView(view, index); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.requestFocus(); - edit.setSelection(0); - for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i); - } - } - - private void switchToListMode(String text) { - mEditTextList.removeAllViews(); - String[] items = text.split("\n"); - int index = 0; - for (String item : items) { - if(!TextUtils.isEmpty(item)) { - mEditTextList.addView(getListItem(item, index)); - index++; - } - } - mEditTextList.addView(getListItem("", index)); - mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); - - mNoteEditor.setVisibility(View.GONE); - mEditTextList.setVisibility(View.VISIBLE); - } - - private Spannable getHighlightQueryResult(String fullText, String userQuery) { - SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); - if (!TextUtils.isEmpty(userQuery)) { - mPattern = Pattern.compile(userQuery); - Matcher m = mPattern.matcher(fullText); - int start = 0; - while (m.find(start)) { - spannable.setSpan( - new BackgroundColorSpan(this.getResources().getColor( - R.color.user_query_highlight)), m.start(), m.end(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - start = m.end(); - } - } - return spannable; - } - - private View getListItem(String item, int index) { - View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); - final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); - cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - } - } - }); - - if (item.startsWith(TAG_CHECKED)) { - cb.setChecked(true); - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - item = item.substring(TAG_CHECKED.length(), item.length()).trim(); - } else if (item.startsWith(TAG_UNCHECKED)) { - cb.setChecked(false); - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); - } - - edit.setOnTextViewChangeListener(this); - edit.setIndex(index); - edit.setText(getHighlightQueryResult(item, mUserQuery)); - return view; - } - - public void onTextChange(int index, boolean hasText) { - if (index >= mEditTextList.getChildCount()) { - Log.e(TAG, "Wrong index, should not happen"); - return; - } - if(hasText) { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); - } else { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); - } - } - - public void onCheckListModeChanged(int oldMode, int newMode) { - if (newMode == TextNote.MODE_CHECK_LIST) { - switchToListMode(mNoteEditor.getText().toString()); - } else { - if (!getWorkingText()) { - mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", - "")); - } - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mEditTextList.setVisibility(View.GONE); - mNoteEditor.setVisibility(View.VISIBLE); - } - } - - private boolean getWorkingText() { - boolean hasChecked = false; - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < mEditTextList.getChildCount(); i++) { - View view = mEditTextList.getChildAt(i); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - if (!TextUtils.isEmpty(edit.getText())) { - if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { - sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); - hasChecked = true; - } else { - sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); - } - } - } - mWorkingNote.setWorkingText(sb.toString()); - } else { - mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); - } - return hasChecked; - } - - private boolean saveNote() { - getWorkingText(); - boolean saved = mWorkingNote.saveNote(); - if (saved) { - /** - * There are two modes from List view to edit view, open one note, - * create/edit a node. Opening node requires to the original - * position in the list when back from edit view, while creating a - * new node requires to the top of the list. This code - * {@link #RESULT_OK} is used to identify the create/edit state - */ - setResult(RESULT_OK); - } - return saved; - } - - private void sendToDesktop() { - /** - * Before send message to home, we should make sure that current - * editing note is exists in databases. So, for new note, firstly - * save it - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - - if (mWorkingNote.getNoteId() > 0) { - Intent sender = new Intent(); - Intent shortcutIntent = new Intent(this, NoteEditActivity.class); - shortcutIntent.setAction(Intent.ACTION_VIEW); - shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); - sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, - makeShortcutIconTitle(mWorkingNote.getContent())); - sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, - Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); - sender.putExtra("duplicate", true); - sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); - showToast(R.string.info_note_enter_desktop); - sendBroadcast(sender); - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Send to desktop error"); - showToast(R.string.error_note_empty_for_send_to_desktop); - } - } - - private String makeShortcutIconTitle(String content) { - content = content.replace(TAG_CHECKED, ""); - content = content.replace(TAG_UNCHECKED, ""); - return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, - SHORTCUT_ICON_TITLE_MAX_LEN) : content; - } - - private void showToast(int resId) { - showToast(resId, Toast.LENGTH_SHORT); - } - - private void showToast(int resId, int duration) { - Toast.makeText(this, resId, duration).show(); - } -} diff --git a/doc/notes/ui/NoteEditText.java b/doc/notes/ui/NoteEditText.java deleted file mode 100644 index 2afe2a8..0000000 --- a/doc/notes/ui/NoteEditText.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.graphics.Rect; -import android.text.Layout; -import android.text.Selection; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.style.URLSpan; -import android.util.AttributeSet; -import android.util.Log; -import android.view.ContextMenu; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.widget.EditText; - -import net.micode.notes.R; - -import java.util.HashMap; -import java.util.Map; - -public class NoteEditText extends EditText { - private static final String TAG = "NoteEditText"; - private int mIndex; - private int mSelectionStartBeforeDelete; - - private static final String SCHEME_TEL = "tel:" ; - private static final String SCHEME_HTTP = "http:" ; - private static final String SCHEME_EMAIL = "mailto:" ; - - private static final Map sSchemaActionResMap = new HashMap(); - static { - sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); - sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); - sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); - } - - /** - * Call by the {@link NoteEditActivity} to delete or add edit text - */ - public interface OnTextViewChangeListener { - /** - * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens - * and the text is null - */ - void onEditTextDelete(int index, String text); - - /** - * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} - * happen - */ - void onEditTextEnter(int index, String text); - - /** - * Hide or show item option when text change - */ - void onTextChange(int index, boolean hasText); - } - - private OnTextViewChangeListener mOnTextViewChangeListener; - - public NoteEditText(Context context) { - super(context, null); - mIndex = 0; - } - - public void setIndex(int index) { - mIndex = index; - } - - public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { - mOnTextViewChangeListener = listener; - } - - public NoteEditText(Context context, AttributeSet attrs) { - super(context, attrs, android.R.attr.editTextStyle); - } - - public NoteEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - // TODO Auto-generated constructor stub - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - - int x = (int) event.getX(); - int y = (int) event.getY(); - x -= getTotalPaddingLeft(); - y -= getTotalPaddingTop(); - x += getScrollX(); - y += getScrollY(); - - Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); - Selection.setSelection(getText(), off); - break; - } - - return super.onTouchEvent(event); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - return false; - } - break; - case KeyEvent.KEYCODE_DEL: - mSelectionStartBeforeDelete = getSelectionStart(); - break; - default: - break; - } - return super.onKeyDown(keyCode, event); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - switch(keyCode) { - case KeyEvent.KEYCODE_DEL: - if (mOnTextViewChangeListener != null) { - if (0 == mSelectionStartBeforeDelete && mIndex != 0) { - mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); - return true; - } - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - int selectionStart = getSelectionStart(); - String text = getText().subSequence(selectionStart, length()).toString(); - setText(getText().subSequence(0, selectionStart)); - mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - default: - break; - } - return super.onKeyUp(keyCode, event); - } - - @Override - protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { - mOnTextViewChangeListener.onTextChange(mIndex, false); - } else { - mOnTextViewChangeListener.onTextChange(mIndex, true); - } - } - super.onFocusChanged(focused, direction, previouslyFocusedRect); - } - - @Override - protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - - int min = Math.min(selStart, selEnd); - int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); - if (urls.length == 1) { - int defaultResId = 0; - for(String schema: sSchemaActionResMap.keySet()) { - if(urls[0].getURL().indexOf(schema) >= 0) { - defaultResId = sSchemaActionResMap.get(schema); - break; - } - } - - if (defaultResId == 0) { - defaultResId = R.string.note_link_other; - } - - menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( - new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - // goto a new intent - urls[0].onClick(NoteEditText.this); - return true; - } - }); - } - } - super.onCreateContextMenu(menu); - } -} diff --git a/doc/notes/ui/NoteItemData.java b/doc/notes/ui/NoteItemData.java deleted file mode 100644 index 0f5a878..0000000 --- a/doc/notes/ui/NoteItemData.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; - -import net.micode.notes.data.Contact; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.DataUtils; - - -public class NoteItemData { - static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, - NoteColumns.HAS_ATTACHMENT, - NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, - NoteColumns.PARENT_ID, - NoteColumns.SNIPPET, - NoteColumns.TYPE, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - }; - - private static final int ID_COLUMN = 0; - private static final int ALERTED_DATE_COLUMN = 1; - private static final int BG_COLOR_ID_COLUMN = 2; - private static final int CREATED_DATE_COLUMN = 3; - private static final int HAS_ATTACHMENT_COLUMN = 4; - private static final int MODIFIED_DATE_COLUMN = 5; - private static final int NOTES_COUNT_COLUMN = 6; - private static final int PARENT_ID_COLUMN = 7; - private static final int SNIPPET_COLUMN = 8; - private static final int TYPE_COLUMN = 9; - private static final int WIDGET_ID_COLUMN = 10; - private static final int WIDGET_TYPE_COLUMN = 11; - - private long mId; - private long mAlertDate; - private int mBgColorId; - private long mCreatedDate; - private boolean mHasAttachment; - private long mModifiedDate; - private int mNotesCount; - private long mParentId; - private String mSnippet; - private int mType; - private int mWidgetId; - private int mWidgetType; - private String mName; - private String mPhoneNumber; - - private boolean mIsLastItem; - private boolean mIsFirstItem; - private boolean mIsOnlyOneItem; - private boolean mIsOneNoteFollowingFolder; - private boolean mIsMultiNotesFollowingFolder; - - public NoteItemData(Context context, Cursor cursor) { - mId = cursor.getLong(ID_COLUMN); - mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); - mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); - mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; - mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); - mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); - mParentId = cursor.getLong(PARENT_ID_COLUMN); - mSnippet = cursor.getString(SNIPPET_COLUMN); - mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( - NoteEditActivity.TAG_UNCHECKED, ""); - mType = cursor.getInt(TYPE_COLUMN); - mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); - - mPhoneNumber = ""; - if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { - mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); - if (!TextUtils.isEmpty(mPhoneNumber)) { - mName = Contact.getContact(context, mPhoneNumber); - if (mName == null) { - mName = mPhoneNumber; - } - } - } - - if (mName == null) { - mName = ""; - } - checkPostion(cursor); - } - - private void checkPostion(Cursor cursor) { - mIsLastItem = cursor.isLast() ? true : false; - mIsFirstItem = cursor.isFirst() ? true : false; - mIsOnlyOneItem = (cursor.getCount() == 1); - mIsMultiNotesFollowingFolder = false; - mIsOneNoteFollowingFolder = false; - - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { - int position = cursor.getPosition(); - if (cursor.moveToPrevious()) { - if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { - if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true; - } else { - mIsOneNoteFollowingFolder = true; - } - } - if (!cursor.moveToNext()) { - throw new IllegalStateException("cursor move to previous but can't move back"); - } - } - } - } - - public boolean isOneFollowingFolder() { - return mIsOneNoteFollowingFolder; - } - - public boolean isMultiFollowingFolder() { - return mIsMultiNotesFollowingFolder; - } - - public boolean isLast() { - return mIsLastItem; - } - - public String getCallName() { - return mName; - } - - public boolean isFirst() { - return mIsFirstItem; - } - - public boolean isSingle() { - return mIsOnlyOneItem; - } - - public long getId() { - return mId; - } - - public long getAlertDate() { - return mAlertDate; - } - - public long getCreatedDate() { - return mCreatedDate; - } - - public boolean hasAttachment() { - return mHasAttachment; - } - - public long getModifiedDate() { - return mModifiedDate; - } - - public int getBgColorId() { - return mBgColorId; - } - - public long getParentId() { - return mParentId; - } - - public int getNotesCount() { - return mNotesCount; - } - - public long getFolderId () { - return mParentId; - } - - public int getType() { - return mType; - } - - public int getWidgetType() { - return mWidgetType; - } - - public int getWidgetId() { - return mWidgetId; - } - - public String getSnippet() { - return mSnippet; - } - - public boolean hasAlert() { - return (mAlertDate > 0); - } - - public boolean isCallRecord() { - return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); - } - - public static int getNoteType(Cursor cursor) { - return cursor.getInt(TYPE_COLUMN); - } -} diff --git a/doc/notes/ui/NotesListActivity.java b/doc/notes/ui/NotesListActivity.java deleted file mode 100644 index e843aec..0000000 --- a/doc/notes/ui/NotesListActivity.java +++ /dev/null @@ -1,954 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.appwidget.AppWidgetManager; -import android.content.AsyncQueryHandler; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.AsyncTask; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.Log; -import android.view.ActionMode; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Display; -import android.view.HapticFeedbackConstants; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnTouchListener; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ListView; -import android.widget.PopupMenu; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.tool.BackupUtils; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashSet; - -public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { - private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; - - private static final int FOLDER_LIST_QUERY_TOKEN = 1; - - private static final int MENU_FOLDER_DELETE = 0; - - private static final int MENU_FOLDER_VIEW = 1; - - private static final int MENU_FOLDER_CHANGE_NAME = 2; - - private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; - - private enum ListEditState { - NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER - }; - - private ListEditState mState; - - private BackgroundQueryHandler mBackgroundQueryHandler; - - private NotesListAdapter mNotesListAdapter; - - private ListView mNotesListView; - - private Button mAddNewNote; - - private boolean mDispatch; - - private int mOriginY; - - private int mDispatchY; - - private TextView mTitleBar; - - private long mCurrentFolderId; - - private ContentResolver mContentResolver; - - private ModeCallback mModeCallBack; - - private static final String TAG = "NotesListActivity"; - - public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; - - private NoteItemData mFocusNoteDataItem; - - private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; - - private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" - + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " - + NoteColumns.NOTES_COUNT + ">0)"; - - private final static int REQUEST_CODE_OPEN_NODE = 102; - private final static int REQUEST_CODE_NEW_NODE = 103; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.note_list); - initResources(); - - /** - * Insert an introduction when user firstly use this application - */ - setAppInfoFromRawRes(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK - && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { - mNotesListAdapter.changeCursor(null); - } else { - super.onActivityResult(requestCode, resultCode, data); - } - } - - private void setAppInfoFromRawRes() { - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { - StringBuilder sb = new StringBuilder(); - InputStream in = null; - try { - in = getResources().openRawResource(R.raw.introduction); - if (in != null) { - InputStreamReader isr = new InputStreamReader(in); - BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; - int len = 0; - while ((len = br.read(buf)) > 0) { - sb.append(buf, 0, len); - } - } else { - Log.e(TAG, "Read introduction file error"); - return; - } - } catch (IOException e) { - e.printStackTrace(); - return; - } finally { - if(in != null) { - try { - in.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, - AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, - ResourceParser.RED); - note.setWorkingText(sb.toString()); - if (note.saveNote()) { - sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); - } else { - Log.e(TAG, "Save introduction note error"); - return; - } - } - } - - @Override - protected void onStart() { - super.onStart(); - startAsyncNotesListQuery(); - } - - private void initResources() { - mContentResolver = this.getContentResolver(); - mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mNotesListView = (ListView) findViewById(R.id.notes_list); - mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), - null, false); - mNotesListView.setOnItemClickListener(new OnListItemClickListener()); - mNotesListView.setOnItemLongClickListener(this); - mNotesListAdapter = new NotesListAdapter(this); - mNotesListView.setAdapter(mNotesListAdapter); - mAddNewNote = (Button) findViewById(R.id.btn_new_note); - mAddNewNote.setOnClickListener(this); - mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); - mDispatch = false; - mDispatchY = 0; - mOriginY = 0; - mTitleBar = (TextView) findViewById(R.id.tv_title_bar); - mState = ListEditState.NOTE_LIST; - mModeCallBack = new ModeCallback(); - } - - private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { - private DropdownMenu mDropDownMenu; - private ActionMode mActionMode; - private MenuItem mMoveMenu; - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - getMenuInflater().inflate(R.menu.note_list_options, menu); - menu.findItem(R.id.delete).setOnMenuItemClickListener(this); - mMoveMenu = menu.findItem(R.id.move); - if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER - || DataUtils.getUserFolderCount(mContentResolver) == 0) { - mMoveMenu.setVisible(false); - } else { - mMoveMenu.setVisible(true); - mMoveMenu.setOnMenuItemClickListener(this); - } - mActionMode = mode; - mNotesListAdapter.setChoiceMode(true); - mNotesListView.setLongClickable(false); - mAddNewNote.setVisibility(View.GONE); - - View customView = LayoutInflater.from(NotesListActivity.this).inflate( - R.layout.note_list_dropdown_menu, null); - mode.setCustomView(customView); - mDropDownMenu = new DropdownMenu(NotesListActivity.this, - (Button) customView.findViewById(R.id.selection_menu), - R.menu.note_list_dropdown); - mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ - public boolean onMenuItemClick(MenuItem item) { - mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); - updateMenu(); - return true; - } - - }); - return true; - } - - private void updateMenu() { - int selectedCount = mNotesListAdapter.getSelectedCount(); - // Update dropdown menu - String format = getResources().getString(R.string.menu_select_title, selectedCount); - mDropDownMenu.setTitle(format); - MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); - if (item != null) { - if (mNotesListAdapter.isAllSelected()) { - item.setChecked(true); - item.setTitle(R.string.menu_deselect_all); - } else { - item.setChecked(false); - item.setTitle(R.string.menu_select_all); - } - } - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - // TODO Auto-generated method stub - return false; - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - // TODO Auto-generated method stub - return false; - } - - public void onDestroyActionMode(ActionMode mode) { - mNotesListAdapter.setChoiceMode(false); - mNotesListView.setLongClickable(true); - mAddNewNote.setVisibility(View.VISIBLE); - } - - public void finishActionMode() { - mActionMode.finish(); - } - - public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { - mNotesListAdapter.setCheckedItem(position, checked); - updateMenu(); - } - - public boolean onMenuItemClick(MenuItem item) { - if (mNotesListAdapter.getSelectedCount() == 0) { - Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), - Toast.LENGTH_SHORT).show(); - return true; - } - - switch (item.getItemId()) { - case R.id.delete: - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_notes, - mNotesListAdapter.getSelectedCount())); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - batchDelete(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case R.id.move: - startQueryDestinationFolders(); - break; - default: - return false; - } - return true; - } - } - - private class NewNoteOnTouchListener implements OnTouchListener { - - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: { - Display display = getWindowManager().getDefaultDisplay(); - int screenHeight = display.getHeight(); - int newNoteViewHeight = mAddNewNote.getHeight(); - int start = screenHeight - newNoteViewHeight; - int eventY = start + (int) event.getY(); - /** - * Minus TitleBar's height - */ - if (mState == ListEditState.SUB_FOLDER) { - eventY -= mTitleBar.getHeight(); - start -= mTitleBar.getHeight(); - } - /** - * HACKME:When click the transparent part of "New Note" button, dispatch - * the event to the list view behind this button. The transparent part of - * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel) - * and the line top of the button. The coordinate based on left of the "New - * Note" button. The 94 represents maximum height of the transparent part. - * Notice that, if the background of the button changes, the formula should - * also change. This is very bad, just for the UI designer's strong requirement. - */ - if (event.getY() < (event.getX() * (-0.12) + 94)) { - View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 - - mNotesListView.getFooterViewsCount()); - if (view != null && view.getBottom() > start - && (view.getTop() < (start + 94))) { - mOriginY = (int) event.getY(); - mDispatchY = eventY; - event.setLocation(event.getX(), mDispatchY); - mDispatch = true; - return mNotesListView.dispatchTouchEvent(event); - } - } - break; - } - case MotionEvent.ACTION_MOVE: { - if (mDispatch) { - mDispatchY += (int) event.getY() - mOriginY; - event.setLocation(event.getX(), mDispatchY); - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - default: { - if (mDispatch) { - event.setLocation(event.getX(), mDispatchY); - mDispatch = false; - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - } - return false; - } - - }; - - private void startAsyncNotesListQuery() { - String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION - : NORMAL_SELECTION; - mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, - Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { - String.valueOf(mCurrentFolderId) - }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); - } - - private final class BackgroundQueryHandler extends AsyncQueryHandler { - public BackgroundQueryHandler(ContentResolver contentResolver) { - super(contentResolver); - } - - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - switch (token) { - case FOLDER_NOTE_LIST_QUERY_TOKEN: - mNotesListAdapter.changeCursor(cursor); - break; - case FOLDER_LIST_QUERY_TOKEN: - if (cursor != null && cursor.getCount() > 0) { - showFolderListMenu(cursor); - } else { - Log.e(TAG, "Query folder failed"); - } - break; - default: - return; - } - } - } - - private void showFolderListMenu(Cursor cursor) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(R.string.menu_title_select_folder); - final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); - builder.setAdapter(adapter, new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int which) { - DataUtils.batchMoveToFolder(mContentResolver, - mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); - Toast.makeText( - NotesListActivity.this, - getString(R.string.format_move_notes_to_folder, - mNotesListAdapter.getSelectedCount(), - adapter.getFolderName(NotesListActivity.this, which)), - Toast.LENGTH_SHORT).show(); - mModeCallBack.finishActionMode(); - } - }); - builder.show(); - } - - private void createNewNote() { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); - this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); - } - - private void batchDelete() { - new AsyncTask>() { - protected HashSet doInBackground(Void... unused) { - HashSet widgets = mNotesListAdapter.getSelectedWidget(); - if (!isSyncMode()) { - // if not synced, delete notes directly - if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter - .getSelectedItemIds())) { - } else { - Log.e(TAG, "Delete notes error, should not happens"); - } - } else { - // in sync mode, we'll move the deleted note into the trash - // folder - if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter - .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - return widgets; - } - - @Override - protected void onPostExecute(HashSet widgets) { - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - mModeCallBack.finishActionMode(); - } - }.execute(); - } - - private void deleteFolder(long folderId) { - if (folderId == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Wrong folder id, should not happen " + folderId); - return; - } - - HashSet ids = new HashSet(); - ids.add(folderId); - HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, - folderId); - if (!isSyncMode()) { - // if not synced, delete folder directly - DataUtils.batchDeleteNotes(mContentResolver, ids); - } else { - // in sync mode, we'll move the deleted folder into the trash folder - DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER); - } - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - } - - private void openNode(NoteItemData data) { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, data.getId()); - this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); - } - - private void openFolder(NoteItemData data) { - mCurrentFolderId = data.getId(); - startAsyncNotesListQuery(); - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mState = ListEditState.CALL_RECORD_FOLDER; - mAddNewNote.setVisibility(View.GONE); - } else { - mState = ListEditState.SUB_FOLDER; - } - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mTitleBar.setText(R.string.call_record_folder_name); - } else { - mTitleBar.setText(data.getSnippet()); - } - mTitleBar.setVisibility(View.VISIBLE); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.btn_new_note: - createNewNote(); - break; - default: - break; - } - } - - private void showSoftInput() { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - if (inputMethodManager != null) { - inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); - } - } - - private void hideSoftInput(View view) { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - - private void showCreateOrModifyFolderDialog(final boolean create) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); - final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); - showSoftInput(); - if (!create) { - if (mFocusNoteDataItem != null) { - etName.setText(mFocusNoteDataItem.getSnippet()); - builder.setTitle(getString(R.string.menu_folder_change_name)); - } else { - Log.e(TAG, "The long click data item is null"); - return; - } - } else { - etName.setText(""); - builder.setTitle(this.getString(R.string.menu_create_folder)); - } - - builder.setPositiveButton(android.R.string.ok, null); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - hideSoftInput(etName); - } - }); - - final Dialog dialog = builder.setView(view).show(); - final Button positive = (Button)dialog.findViewById(android.R.id.button1); - positive.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - hideSoftInput(etName); - String name = etName.getText().toString(); - if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { - Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), - Toast.LENGTH_LONG).show(); - etName.setSelection(0, etName.length()); - return; - } - if (!create) { - if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID - + "=?", new String[] { - String.valueOf(mFocusNoteDataItem.getId()) - }); - } - } else if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); - } - dialog.dismiss(); - } - }); - - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } - /** - * When the name edit text is null, disable the positive button - */ - etName.addTextChangedListener(new TextWatcher() { - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - // TODO Auto-generated method stub - - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } else { - positive.setEnabled(true); - } - } - - public void afterTextChanged(Editable s) { - // TODO Auto-generated method stub - - } - }); - } - - @Override - public void onBackPressed() { - switch (mState) { - case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - startAsyncNotesListQuery(); - mTitleBar.setVisibility(View.GONE); - break; - case CALL_RECORD_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - mAddNewNote.setVisibility(View.VISIBLE); - mTitleBar.setVisibility(View.GONE); - startAsyncNotesListQuery(); - break; - case NOTE_LIST: - super.onBackPressed(); - break; - default: - break; - } - } - - private void updateWidget(int appWidgetId, int appWidgetType) { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (appWidgetType == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - appWidgetId - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); - } - - private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - if (mFocusNoteDataItem != null) { - menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); - menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view); - menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete); - menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name); - } - } - }; - - @Override - public void onContextMenuClosed(Menu menu) { - if (mNotesListView != null) { - mNotesListView.setOnCreateContextMenuListener(null); - } - super.onContextMenuClosed(menu); - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - if (mFocusNoteDataItem == null) { - Log.e(TAG, "The long click data item is null"); - return false; - } - switch (item.getItemId()) { - case MENU_FOLDER_VIEW: - openFolder(mFocusNoteDataItem); - break; - case MENU_FOLDER_DELETE: - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_folder)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteFolder(mFocusNoteDataItem.getId()); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - break; - case MENU_FOLDER_CHANGE_NAME: - showCreateOrModifyFolderDialog(false); - break; - default: - break; - } - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.clear(); - if (mState == ListEditState.NOTE_LIST) { - getMenuInflater().inflate(R.menu.note_list, menu); - // set sync or sync_cancel - menu.findItem(R.id.menu_sync).setTitle( - GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync); - } else if (mState == ListEditState.SUB_FOLDER) { - getMenuInflater().inflate(R.menu.sub_folder, menu); - } else if (mState == ListEditState.CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_record_folder, menu); - } else { - Log.e(TAG, "Wrong state:" + mState); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_new_folder: { - showCreateOrModifyFolderDialog(true); - break; - } - case R.id.menu_export_text: { - exportNoteToText(); - break; - } - case R.id.menu_sync: { - if (isSyncMode()) { - if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { - GTaskSyncService.startSync(this); - } else { - GTaskSyncService.cancelSync(this); - } - } else { - startPreferenceActivity(); - } - break; - } - case R.id.menu_setting: { - startPreferenceActivity(); - break; - } - case R.id.menu_new_note: { - createNewNote(); - break; - } - case R.id.menu_search: - onSearchRequested(); - break; - default: - break; - } - return true; - } - - @Override - public boolean onSearchRequested() { - startSearch(null, false, null /* appData */, false); - return true; - } - - private void exportNoteToText() { - final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); - new AsyncTask() { - - @Override - protected Integer doInBackground(Void... unused) { - return backup.exportToText(); - } - - @Override - protected void onPostExecute(Integer result) { - if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_unmounted)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SUCCESS) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.success_sdcard_export)); - builder.setMessage(NotesListActivity.this.getString( - R.string.format_exported_file_location, backup - .getExportedTextFileName(), backup.getExportedTextFileDir())); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SYSTEM_ERROR) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_export)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } - } - - }.execute(); - } - - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - - private void startPreferenceActivity() { - Activity from = getParent() != null ? getParent() : this; - Intent intent = new Intent(from, NotesPreferenceActivity.class); - from.startActivityIfNeeded(intent, -1); - } - - private class OnListItemClickListener implements OnItemClickListener { - - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - NoteItemData item = ((NotesListItem) view).getItemData(); - if (mNotesListAdapter.isInChoiceMode()) { - if (item.getType() == Notes.TYPE_NOTE) { - position = position - mNotesListView.getHeaderViewsCount(); - mModeCallBack.onItemCheckedStateChanged(null, position, id, - !mNotesListAdapter.isSelectedItem(position)); - } - return; - } - - switch (mState) { - case NOTE_LIST: - if (item.getType() == Notes.TYPE_FOLDER - || item.getType() == Notes.TYPE_SYSTEM) { - openFolder(item); - } else if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in NOTE_LIST"); - } - break; - case SUB_FOLDER: - case CALL_RECORD_FOLDER: - if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in SUB_FOLDER"); - } - break; - default: - break; - } - } - } - - } - - private void startQueryDestinationFolders() { - String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; - selection = (mState == ListEditState.NOTE_LIST) ? selection: - "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; - - mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, - null, - Notes.CONTENT_NOTE_URI, - FoldersListAdapter.PROJECTION, - selection, - new String[] { - String.valueOf(Notes.TYPE_FOLDER), - String.valueOf(Notes.ID_TRASH_FOLER), - String.valueOf(mCurrentFolderId) - }, - NoteColumns.MODIFIED_DATE + " DESC"); - } - - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - mFocusNoteDataItem = ((NotesListItem) view).getItemData(); - if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { - if (mNotesListView.startActionMode(mModeCallBack) != null) { - mModeCallBack.onItemCheckedStateChanged(null, position, id, true); - mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - } else { - Log.e(TAG, "startActionMode fails"); - } - } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { - mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); - } - } - return false; - } -} diff --git a/doc/notes/ui/NotesListAdapter.java b/doc/notes/ui/NotesListAdapter.java deleted file mode 100644 index 51c9cb9..0000000 --- a/doc/notes/ui/NotesListAdapter.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; - -import net.micode.notes.data.Notes; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - - -public class NotesListAdapter extends CursorAdapter { - private static final String TAG = "NotesListAdapter"; - private Context mContext; - private HashMap mSelectedIndex; - private int mNotesCount; - private boolean mChoiceMode; - - public static class AppWidgetAttribute { - public int widgetId; - public int widgetType; - }; - - public NotesListAdapter(Context context) { - super(context, null); - mSelectedIndex = new HashMap(); - mContext = context; - mNotesCount = 0; - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new NotesListItem(context); - } - - @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof NotesListItem) { - NoteItemData itemData = new NoteItemData(context, cursor); - ((NotesListItem) view).bind(context, itemData, mChoiceMode, - isSelectedItem(cursor.getPosition())); - } - } - - public void setCheckedItem(final int position, final boolean checked) { - mSelectedIndex.put(position, checked); - notifyDataSetChanged(); - } - - public boolean isInChoiceMode() { - return mChoiceMode; - } - - public void setChoiceMode(boolean mode) { - mSelectedIndex.clear(); - mChoiceMode = mode; - } - - public void selectAll(boolean checked) { - Cursor cursor = getCursor(); - for (int i = 0; i < getCount(); i++) { - if (cursor.moveToPosition(i)) { - if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { - setCheckedItem(i, checked); - } - } - } - } - - public HashSet getSelectedItemIds() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { - Long id = getItemId(position); - if (id == Notes.ID_ROOT_FOLDER) { - Log.d(TAG, "Wrong item id, should not happen"); - } else { - itemSet.add(id); - } - } - } - - return itemSet; - } - - public HashSet getSelectedWidget() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { - Cursor c = (Cursor) getItem(position); - if (c != null) { - AppWidgetAttribute widget = new AppWidgetAttribute(); - NoteItemData item = new NoteItemData(mContext, c); - widget.widgetId = item.getWidgetId(); - widget.widgetType = item.getWidgetType(); - itemSet.add(widget); - /** - * Don't close cursor here, only the adapter could close it - */ - } else { - Log.e(TAG, "Invalid cursor"); - return null; - } - } - } - return itemSet; - } - - public int getSelectedCount() { - Collection values = mSelectedIndex.values(); - if (null == values) { - return 0; - } - Iterator iter = values.iterator(); - int count = 0; - while (iter.hasNext()) { - if (true == iter.next()) { - count++; - } - } - return count; - } - - public boolean isAllSelected() { - int checkedCount = getSelectedCount(); - return (checkedCount != 0 && checkedCount == mNotesCount); - } - - public boolean isSelectedItem(final int position) { - if (null == mSelectedIndex.get(position)) { - return false; - } - return mSelectedIndex.get(position); - } - - @Override - protected void onContentChanged() { - super.onContentChanged(); - calcNotesCount(); - } - - @Override - public void changeCursor(Cursor cursor) { - super.changeCursor(cursor); - calcNotesCount(); - } - - private void calcNotesCount() { - mNotesCount = 0; - for (int i = 0; i < getCount(); i++) { - Cursor c = (Cursor) getItem(i); - if (c != null) { - if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; - } - } else { - Log.e(TAG, "Invalid cursor"); - return; - } - } - } -} diff --git a/doc/notes/ui/NotesListItem.java b/doc/notes/ui/NotesListItem.java deleted file mode 100644 index 1221e80..0000000 --- a/doc/notes/ui/NotesListItem.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.text.format.DateUtils; -import android.view.View; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - - -public class NotesListItem extends LinearLayout { - private ImageView mAlert; - private TextView mTitle; - private TextView mTime; - private TextView mCallName; - private NoteItemData mItemData; - private CheckBox mCheckBox; - - public NotesListItem(Context context) { - super(context); - inflate(context, R.layout.note_item, this); - mAlert = (ImageView) findViewById(R.id.iv_alert_icon); - mTitle = (TextView) findViewById(R.id.tv_title); - mTime = (TextView) findViewById(R.id.tv_time); - mCallName = (TextView) findViewById(R.id.tv_name); - mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); - } - - public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { - if (choiceMode && data.getType() == Notes.TYPE_NOTE) { - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setChecked(checked); - } else { - mCheckBox.setVisibility(View.GONE); - } - - mItemData = data; - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.GONE); - mAlert.setVisibility(View.VISIBLE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - mTitle.setText(context.getString(R.string.call_record_folder_name) - + context.getString(R.string.format_folder_files_count, data.getNotesCount())); - mAlert.setImageResource(R.drawable.call_record); - } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.VISIBLE); - mCallName.setText(data.getCallName()); - mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } else { - mCallName.setVisibility(View.GONE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - - if (data.getType() == Notes.TYPE_FOLDER) { - mTitle.setText(data.getSnippet() - + context.getString(R.string.format_folder_files_count, - data.getNotesCount())); - mAlert.setVisibility(View.GONE); - } else { - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } - } - mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); - - setBackground(data); - } - - private void setBackground(NoteItemData data) { - int id = data.getBgColorId(); - if (data.getType() == Notes.TYPE_NOTE) { - if (data.isSingle() || data.isOneFollowingFolder()) { - setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); - } else if (data.isLast()) { - setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); - } else if (data.isFirst() || data.isMultiFollowingFolder()) { - setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); - } else { - setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); - } - } else { - setBackgroundResource(NoteItemBgResources.getFolderBgRes()); - } - } - - public NoteItemData getItemData() { - return mItemData; - } -} diff --git a/doc/notes/ui/NotesPreferenceActivity.java b/doc/notes/ui/NotesPreferenceActivity.java deleted file mode 100644 index 07c5f7e..0000000 --- a/doc/notes/ui/NotesPreferenceActivity.java +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.ActionBar; -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; - - -public class NotesPreferenceActivity extends PreferenceActivity { - public static final String PREFERENCE_NAME = "notes_preferences"; - - public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; - - public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; - - public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; - - private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; - - private static final String AUTHORITIES_FILTER_KEY = "authorities"; - - private PreferenceCategory mAccountCategory; - - private GTaskReceiver mReceiver; - - private Account[] mOriAccounts; - - private boolean mHasAddedAccount; - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - - /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); - - addPreferencesFromResource(R.xml.preferences); - mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); - mReceiver = new GTaskReceiver(); - IntentFilter filter = new IntentFilter(); - filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); - - mOriAccounts = null; - View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - getListView().addHeaderView(header, null, true); - } - - @Override - protected void onResume() { - super.onResume(); - - // need to set sync account automatically if user has added a new - // account - if (mHasAddedAccount) { - Account[] accounts = getGoogleAccounts(); - if (mOriAccounts != null && accounts.length > mOriAccounts.length) { - for (Account accountNew : accounts) { - boolean found = false; - for (Account accountOld : mOriAccounts) { - if (TextUtils.equals(accountOld.name, accountNew.name)) { - found = true; - break; - } - } - if (!found) { - setSyncAccount(accountNew.name); - break; - } - } - } - } - - refreshUI(); - } - - @Override - protected void onDestroy() { - if (mReceiver != null) { - unregisterReceiver(mReceiver); - } - super.onDestroy(); - } - - private void loadAccountPreference() { - mAccountCategory.removeAll(); - - Preference accountPref = new Preference(this); - final String defaultAccount = getSyncAccountName(this); - accountPref.setTitle(getString(R.string.preferences_account_title)); - accountPref.setSummary(getString(R.string.preferences_account_summary)); - accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - if (!GTaskSyncService.isSyncing()) { - if (TextUtils.isEmpty(defaultAccount)) { - // the first time to set account - showSelectAccountAlertDialog(); - } else { - // if the account has already been set, we need to promp - // user about the risk - showChangeAccountConfirmAlertDialog(); - } - } else { - Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) - .show(); - } - return true; - } - }); - - mAccountCategory.addPreference(accountPref); - } - - private void loadSyncButton() { - Button syncButton = (Button) findViewById(R.id.preference_sync_button); - TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - - // set button state - if (GTaskSyncService.isSyncing()) { - syncButton.setText(getString(R.string.preferences_button_sync_cancel)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.cancelSync(NotesPreferenceActivity.this); - } - }); - } else { - syncButton.setText(getString(R.string.preferences_button_sync_immediately)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.startSync(NotesPreferenceActivity.this); - } - }); - } - syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - - // set last sync time - if (GTaskSyncService.isSyncing()) { - lastSyncTimeView.setText(GTaskSyncService.getProgressString()); - lastSyncTimeView.setVisibility(View.VISIBLE); - } else { - long lastSyncTime = getLastSyncTime(this); - if (lastSyncTime != 0) { - lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, - DateFormat.format(getString(R.string.preferences_last_sync_time_format), - lastSyncTime))); - lastSyncTimeView.setVisibility(View.VISIBLE); - } else { - lastSyncTimeView.setVisibility(View.GONE); - } - } - } - - private void refreshUI() { - loadAccountPreference(); - loadSyncButton(); - } - - private void showSelectAccountAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - - View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); - TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); - titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - - dialogBuilder.setCustomTitle(titleView); - dialogBuilder.setPositiveButton(null, null); - - Account[] accounts = getGoogleAccounts(); - String defAccount = getSyncAccountName(this); - - mOriAccounts = accounts; - mHasAddedAccount = false; - - if (accounts.length > 0) { - CharSequence[] items = new CharSequence[accounts.length]; - final CharSequence[] itemMapping = items; - int checkedItem = -1; - int index = 0; - for (Account account : accounts) { - if (TextUtils.equals(account.name, defAccount)) { - checkedItem = index; - } - items[index++] = account.name; - } - dialogBuilder.setSingleChoiceItems(items, checkedItem, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - setSyncAccount(itemMapping[which].toString()); - dialog.dismiss(); - refreshUI(); - } - }); - } - - View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); - dialogBuilder.setView(addAccountView); - - final AlertDialog dialog = dialogBuilder.show(); - addAccountView.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - mHasAddedAccount = true; - Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); - intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { - "gmail-ls" - }); - startActivityForResult(intent, -1); - dialog.dismiss(); - } - }); - } - - private void showChangeAccountConfirmAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - - View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); - TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); - titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, - getSyncAccountName(this))); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); - dialogBuilder.setCustomTitle(titleView); - - CharSequence[] menuItemArray = new CharSequence[] { - getString(R.string.preferences_menu_change_account), - getString(R.string.preferences_menu_remove_account), - getString(R.string.preferences_menu_cancel) - }; - dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - if (which == 0) { - showSelectAccountAlertDialog(); - } else if (which == 1) { - removeSyncAccount(); - refreshUI(); - } - } - }); - dialogBuilder.show(); - } - - private Account[] getGoogleAccounts() { - AccountManager accountManager = AccountManager.get(this); - return accountManager.getAccountsByType("com.google"); - } - - private void setSyncAccount(String account) { - if (!getSyncAccountName(this).equals(account)) { - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - if (account != null) { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); - } else { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - editor.commit(); - - // clean up last sync time - setLastSyncTime(this, 0); - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - - Toast.makeText(NotesPreferenceActivity.this, - getString(R.string.preferences_toast_success_set_accout, account), - Toast.LENGTH_SHORT).show(); - } - } - - private void removeSyncAccount() { - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { - editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); - } - if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { - editor.remove(PREFERENCE_LAST_SYNC_TIME); - } - editor.commit(); - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - } - - public static String getSyncAccountName(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - - public static void setLastSyncTime(Context context, long time) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); - editor.commit(); - } - - public static long getLastSyncTime(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); - } - - private class GTaskReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - refreshUI(); - if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { - TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - syncStatus.setText(intent - .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); - } - - } - } - - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - Intent intent = new Intent(this, NotesListActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - return true; - default: - return false; - } - } -} diff --git a/doc/notes/widget/NoteWidgetProvider.java b/doc/notes/widget/NoteWidgetProvider.java deleted file mode 100644 index ec6f819..0000000 --- a/doc/notes/widget/NoteWidgetProvider.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.util.Log; -import android.widget.RemoteViews; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NoteEditActivity; -import net.micode.notes.ui.NotesListActivity; - -public abstract class NoteWidgetProvider extends AppWidgetProvider { - public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_ID, - NoteColumns.SNIPPET - }; - - public static final int COLUMN_ID = 0; - public static final int COLUMN_BG_COLOR_ID = 1; - public static final int COLUMN_SNIPPET = 2; - - private static final String TAG = "NoteWidgetProvider"; - - @Override - public void onDeleted(Context context, int[] appWidgetIds) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - for (int i = 0; i < appWidgetIds.length; i++) { - context.getContentResolver().update(Notes.CONTENT_NOTE_URI, - values, - NoteColumns.WIDGET_ID + "=?", - new String[] { String.valueOf(appWidgetIds[i])}); - } - } - - private Cursor getNoteWidgetInfo(Context context, int widgetId) { - return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, - null); - } - - protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); - } - - private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, - boolean privacyMode) { - for (int i = 0; i < appWidgetIds.length; i++) { - if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { - int bgId = ResourceParser.getDefaultBgId(context); - String snippet = ""; - Intent intent = new Intent(context, NoteEditActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); - - Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); - if (c != null && c.moveToFirst()) { - if (c.getCount() > 1) { - Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); - c.close(); - return; - } - snippet = c.getString(COLUMN_SNIPPET); - bgId = c.getInt(COLUMN_BG_COLOR_ID); - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); - intent.setAction(Intent.ACTION_VIEW); - } else { - snippet = context.getResources().getString(R.string.widget_havenot_content); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - } - - if (c != null) { - c.close(); - } - - RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); - rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); - intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); - /** - * Generate the pending intent to start host for the widget - */ - PendingIntent pendingIntent = null; - if (privacyMode) { - rv.setTextViewText(R.id.widget_text, - context.getString(R.string.widget_under_visit_mode)); - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( - context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); - } else { - rv.setTextViewText(R.id.widget_text, snippet); - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, - PendingIntent.FLAG_UPDATE_CURRENT); - } - - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); - } - } - } - - protected abstract int getBgResourceId(int bgId); - - protected abstract int getLayoutId(); - - protected abstract int getWidgetType(); -} diff --git a/doc/notes/widget/NoteWidgetProvider_2x.java b/doc/notes/widget/NoteWidgetProvider_2x.java deleted file mode 100644 index adcb2f7..0000000 --- a/doc/notes/widget/NoteWidgetProvider_2x.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_2x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - @Override - protected int getLayoutId() { - return R.layout.widget_2x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_2X; - } -} diff --git a/doc/notes/widget/NoteWidgetProvider_4x.java b/doc/notes/widget/NoteWidgetProvider_4x.java deleted file mode 100644 index c12a02e..0000000 --- a/doc/notes/widget/NoteWidgetProvider_4x.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_4x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - protected int getLayoutId() { - return R.layout.widget_4x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; - } -} diff --git a/doc/小米便签成功截图.png b/doc/小米便签成功截图.png deleted file mode 100644 index 6be1e6c70e93165487dbc494bcd2c3e8247d423c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408936 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�JeLwkB3dW_P}Z&FVe`Uiml%9Asqh(m9=WZi!6NP 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
LesqD|G znD2`WlI7dKyPq#l=-hvsU2&V?xi0NfaXUZ4psK#o@I`o8rs6y5xhH|ulKqtVoj)}> zgVS!4MiP#}31cD%aMNsGgx`NLtGWM%(4JCVSB?M9RfdEooqetaWv|FVSI2#JKXl`-7Y}_z)h|v}7&ii3$j=?dONG9%CaKy~SZs1SQQ6n!$p-Q(Bz-69 zq;BWF<7Drae@ngh)$n$xDy;QFvX+YBW$yX#ndFyJiu4G}=nXDcwg?KIuone{P%f$` z_p1f*RTW<5y0TtI=A~%O(Oi9SR~9YSeE)8Z#WkrXL0vrRkwV7J9_4|;-LUtNQG7mn zFWrDf^ANWGU_zfUuM5|z1ISiM8+^g~-iMntm4B>#~K&+_H7;&R*}XJPkH4%bEF4CC zPWp=3?!rGR@@-&jX^)5jL`ipI`dBj;q-z`cJ#3trmyNTPylikum$Fq;CR3y1q%oNB zL;V+J-5}84iEjhX1lE(t*Q0PjxU3*WT#?Hu78-(Eo@e)(msGw}(}>+0OrUUM)wqz# z@BJ+8#$EgN^J{u}_RdwQ^)fN3CrRwq}1{ka&otSNnr$V z5Gk;CW(s|((F#;mn^B2T^ljTV{jHtbikiS{OfRoF#g!eSG%-w{psgXnl|w#INRh=Y zYu(4rk~LxBvEo=IvZzqaq+rENhowah$Q_(gCxX<}%Ny-HuX zxY|_SgxORvtFu14;9DLutS%#LXTdHgB(ZqVq(7;?)2uhip0uR3-bBSXFeH&nby+ig zvRLh%3)6)FDYH!k?g-+twu0Zwz_>Of@r6Utwp&bv+05@R+%*=M>P)%;F)@=~J9^`> z1^i$8GBB8L^B#`y4w7{z_PoO*|1C9g$da3V&Q8jw8c3=pvdd1|t9(IP`8E5q1zD~m zMkmi%{wj+H=_qSJGOoHnM}=L>{i>pa-0e1=!`yrCLheOZl!jQ4sSjjG;gKAwpL^!( zb4OYbF;67~9>z45e|L6@$wzbQGZu=j^4v$w*VT|@i5(m4j0pu(aI(~zUq4~fHOO2b zAM7Lz<+paz50`8$f&3tsge^{Ea}-&H}wsea$c*OFqLjI-V%)SE)hy0o{ici>TDLo zBwOrWy38+&jkf?Y%WH;Xn(o45CP-0Vg=vYje!Zt-#ZEyIzb!~tZ=!N#|WPj+wk-=xoBA=Q{+#yZc&UoGxzT9ffvWK#^5^m@XqO*r7?Q6hu z`-1YPLtL(%S_zsl#N;ejvuJBH*wyhid}XweAtAUVfsU)mS!yaO&q0A*joUm!rfc=c z?^2Ih$;iMfWs)PU;rIQ{zMe%6$jZuFWv>*OuAVGC(nwCl?bX$lf^Ff>UmE)Ygp;^t z3qL+YCnslZ*$a3ZMBGDr`!=8d_{RGMud&IpQZ+pbS7Km~9BForY5ukxX`D0#g*Nl; zx2j}QEB0r(wy(wMmUG?9E1W1E^MzWo4U3LtbxJGB<~XW*#WHh%j!6~OL4G#LHdEs~ zLDiwh;ft!;g;Mb;v3V(^rClm?2rhoHsRC=c#=wtwlqHOT!W#(+3Uc%2P2=r6JIY2O z^iKvdw^S!E-vLZbPT^sV&?gnO`p;47+B4iTG6%We-X3pBtBkonjY>n%As#(+?O2vk zJNayI!7kdHRSfgQMtx^76_d8`d#SqhRExZgPR)6LKen+vTy@_@-5`UR+|BVCJ>)}3 zmKjE;OYLt9v540hWh?Qrf$x}qWPtGq!V>DvNzBAk%F0hbzp;E-rzqw+cIF}zFS9{g zyUJViQMORczCN=MY}Jzn-0zIfRn(q`g@k70cHC9BVU@>LeK#-2u98)&rrSEgMX%TP zGN_=TqeSAXRG`%6<-BqdHLs}OPZq+UV5z+F;p=a9$G;=eu+=qPUB9|JGw8R4r^46g zLvSo;_KD`>>+&bFI|q&FZ_umTc{{}g5pUE}?I?%K();F;O@)1{PU3_kF&X{~avfv) zWAicOwU6Z8wiFVkG$(~S6RX2J<3tr@$F4py?@r3Qko9Dm51AYcOW!)8(x#zdpRv?>#l*>5g-<j~xY2beG;ScQvKK z#zN<&&^cLp`Hc6w1yZr@=G2_!@H(^iarj`2;cp#-vMZ>-Zpd;H_I)V}=#(w}Xnk|^ z9As6ci}pE#mF?9-lcRT7l9tR|7>=qS&MXw3s9LiIH0ka>;t;$P)LJkkECm(EmZA`v zH3p$vB!+Y1-+5P#?X@c|=GI^!BlC(@F(X*Siq_EB#Kc~YyNQ2IK65w>Jnbi64h}la z?0;D~HLVPVQ7lJ)`YitI!>{Q0j~yxZ-jxAjKJxnwqvgYzO=?q+xRMBmpx<~{wvws-0nt2gw9xVLW8bQKmAdVf zY>-=&g<7xlvC)ru)-gf!w@YA?(s8qLb4oU&uAB9?&|nB6IaBr6(%fEUcd~t5TGf2J ze08lM|7K`9XDy~qoqHsuIR|n4Bwm#NIDNa)!XcgXe3v{x8 zP;kAS4QpJVrJmB%dT~flr8JbcUAfMqesirIy zD9?V_DRJc2&xJtIg!<-5M45~!NmsW&X>9JN!6+?A+|6EDpx}1ca2Bjxz0=4k)F*Q? zICy^On3b0tOBScBEzLkR>-;H&Z=Dd15SHC;J6xX`4LuqyC*`(85Ib7;Nmh0w|L{Kv znH*c6{Fz+oIOv$5T<3e(tff51;;sJu!m&2}OTN9V`N7xaBi9RKL4lfYsu%avuecu7 z^dAbb4|F+HlFLPIJ20xAWkemhT}UQ17rNq$3^;%2WlJ*3a+z&Pv8!b`W8E!U z|4AZQTCbeLOtA1j@C42Y7!4RmF>Ok`nYC0gl~Xp-e&Hn>wXe7PjSoKieU&YJd+qvis=lsd8*%YCSMx~e4S zdOHvHilec{e{@zX@gT(EF>KONXHO4ngy-$WBz9e$s0}9Y8QUI+As}wGl8AZ+?&W|a zfyi^bVYe2Nj;~)IgnTFyh8Oa{fx^Z(-Yul9TMMJ1dGSkn4>AO`KYH*;)kK5L!+&|j zq^x5(#6{UN%)kMANNIZCM&=|NC~pLCYU(uzdP`rn3FQa|Y>I~(_Db9>whh-$+Ixde zz~JRbChmtpY&g3^lv;YH(i&@jOxEt2y7M9>aLBndT%`9U-}2NU#;S`<{TD~g;6{9t zDVO`$q=aA52JiQe`Chr>G>LXQy_vm@uixY?Uy5SVaNeeAM z(66iW^zC~@ClK@5nwn+A$#y8F?rf48b-emYE&be0d|LOYb?cUWmQ9)_fvB{l8g-lp z^R{{Yvq;6`)l`)$T-ZSA;2rD(v(29cN0Y*AuD)NFtYj1s8wc_i`IkdY`LQWkiW}q? zhKe+QHhf&?w(L{ zaW?iLr+%fSu}kY?JlLH%W&Z0x4Vq-SBdjy7*NU2M?;f_EgzrTs1>BXPRx?ow` zh)k%%;O)RexdrtV2K~^AknbcNpj|;(N(uwdaA05(%_?je#bgvhjIwq9Ol-d3qt@0` z<~d&*9$okM&>+Tdzey;GU+%xdA)%ps`N4*-c@d_qC?P{rOJR8aXw%RJ{F zy{7CxJl>w-Me~+LFMaN7NJnQlRgQn#ZK~Xe&~(>l{M2b;`K&( z%w+l~h9myv*-Q#nOHIP{W1r;sW%9@Qu}N8q)~Ko$^JIbp2wqtE%^le7+j?1%8tj8- z^(63!!FxPf4z&eq^U0d)p)d`D6 zi`lS*sH2g(n5HY6sa5tI4?)qiH^#kV;DSFT<_n6ur)ek&v@ zIQ3`K=qAl5uo1*zxu#8fq7VQ81n+Vk!2@^qxYQr0zuv9`*V7WEa21hNq9aSGP^0pFpi0fdkf=xJX`W(9BP9`h z(s?_Jrttu`1jYI6z_`wN``)z2ZljvMeh<`FPC;Q5>gxy!$Rw|b;KixCu$$X5aEa4j zOeEw~k_M5%doe;KA%~A1sYv+I&lL6ghG>o{zLr4E%F5o4TbT1*P|NPG;b%ioKmLq? zi<&IbnS|m0Ogz12{6P04wS<*HYdjFoO33he%+B6Kp1mtgx_b5m0ehsi-$LE@U&T2M zNj4*kQv?|`$0u?p^s$Z9Io1J9UJ~P`^2UKAQuaZ&Od%+omS~!R615|Nq?XsJ>^xpU6yAogEAKL~# z_Gy%S+393J^JPL51!d^20~p5IIl)$G`HT2yW#?oa%K^8jatEW7dTNXXrSJmb)ZUYT zIzieui%|9965YeU`N51!S`c=BnWayodDk{e+PwzYRs_{=xHZ zAN%vq{n^iUGHIIbe8av5G7si64Q||~z4yuB3$NcyOy#m5U*r->$}KMmOc<|8x0XF) z9n&M`goQVYzY^Ds(pi-C74r-T9)6<@YT;syz0f_crJ1KZy1@*6^XP}bLjNS9h|6Tb z>LQE@>+F8(-1hG0#G%{u-v*QWUz5L1l3?^Z#F)a&!Lm&ho;Et*pP1^}=*-^qx-9PF z+91foUpaTG6AKUz{?CgkZi2^%`kVBnN>Mb4XT=?8K{o62o{x1|KlI76{ThV@&8WUL zRPxKh?%Dtw^=|fEgY2BHONp6*eDDx}I>)dO?XpAfsib;M#YxG+^EphL>VrgF&Tc`wMMbD46pY zP|ARD3=Yl;>?R^)jfOAyW{<|pf9Ld?irao18&?x1?4@@%Fz{u6t}=u6kzae<(e8FD z8^2=nJmDBawtk~kYEcAePpz^G<`3vSeJ$vWj>Cd)Ac4F_mP2h~dGoCNBuUjCw%jgg}y@;T)T$Bu=IcajUAhW=h1 z$i|ObZ_UTd?_kRsyws`7S%$gSXeib`-L9XsSK{!4T9CEyg|40Si`IA(T^=`Jd!bR8 zH$S&!XRR2lx1Dv7??aV;x(rk{!`sP+mcF<}ixebTr0k|GTcTm`la(v*^lwd^#bT*^ zd=@L>PuAR&%qzkbS-y>`L4bPqyf4aD7yYL89<$Qa_{jqXkq`FOxQ@$C7R~h>)+OmHY(vcwgDf61AW~#T!A`F< zd7@@Wy@B?3)4vTY8!UGQK|s6Jrl#E(#>`xh%bDXclxD+IGj-3fHp*pCc6+zq^rCmD z)`_jMcE_p&gR^=+TKTY(e66)O^k}_!Y<)S)N$s_6rKo^66_vTN@lL%2bPE>RTV$K# zmZxDb)D+m6tzKo+Cm^UkOIQl=aM@mb`Z;@`u8#O<$432TNA)NZBxgJmsUSOp#T`B9 zFO|0tm7l7JKxRcNG}d3UsD>VkbO_-sNAH+_{i!--ewZkfyX;Hht9m+^Gw4S?mA79O z@{FJuye|5Li*oiMg{}!UH6GQt#e=1R=w$plScy$WT{73>?~ml_Rq)Ivn~sy3=CLSq zo!>~q?`ah$spNYW1}4myVnuK@hb4xsh3w>aa&i*Jf6C6Dk~1TZjdzFxVvvC? z3`~MjFvc|m3z&94T5N#5_;Hs0fnlzsA)CAWIF5d_zlFiM12>i#2X+4-0x!h`ZQ!6u zb0~zAB^Q*Ee%p|jpzs>`K_Oh0fF~yhA{umYLUfdW&k@;(H0lA~T|m=AZi3Rrqk}Gv zp@|Apm@2Ky?o5v=EekXAV>&wDh1ZKro~`Hx=(C^}j{e=a0DFXu_5sjf5r77p6=#qE1frwZ_3M66 z8xq1biuHb}(w1QYrgj^kAeHX zR4N29A51d{B$>>Chz~cI04^gV^BRbB8MavZU~u?xsM2B}7r00N*FpXdA$R*?H#>?^ zaS)6j2Xv2%?HcpLm7Yq&7F1>q4pWrE0;xTze>SWI$jH!?S6O4hjuV^HpqD!|7pHR@ zrrd8v@4xgAC$tg$Uuu=Su8`}%h4oamvaT*AvOUtIH%a>8!-r}*`6-q*d{R;`h5&T} z6_^~TFSn(S_~ji?GzS}r$wBXPOqc3?=8&)36l9{_eOz`khvsxb#%|X z$Z0;Kpwfw7jb}e1IC2wwsat`y>(<#_{I^D*bV2I?YV?<6(60Yo6zHzaLLi*$fV|s! z$0vrPVO7O_)Kfs{ue6(&=FY~k*5 z{%w1iUHrY%@=$2d1+{Cm*9E!v-8l+O(eowQeCTw4-hCpt4M7tgirm;48_et5=#$3t zy}q?L?=uz}XzIj@8J0V9L5?HX&Kp3x`O8GJOwcv!OA$HR`%W+fL`{HXRq9tDkTi68 zc6bHkYtTcXCPbI<@pn@pkN!DMaR@*#Q36WZ3B-EzO0Y*`Afu$=@`>x2k8(x;)E!Lls0PU zc z^g#6c6Ns)6!-33Kh81&ec6Lw*E*{fsRAKlf2r8cWm6me;{VGGyx#3Gm)M8TyaR&V= zYP?i8MI1XEqGB(1ClSrp3wPN%^xop!@vV0DrT=!H!4AFsyJW|Ep(frcBbmf%@h@Mj zuX)eAo@Bh*oto2%+dkcSb0YA$|G8JCP1k|)%W z6tMzEOC#ZGQs;)eeo#tpRSIg})PTAedYoJ4IF_D2)gK}*N5BIg>;6Bqs6rHAxIPdw zsyuf^52p|jgrnU;jsJrB;Xkh_papPvMf$zbOKoABd=q2J<)Orrqi$l)lq`f+r}&Ir z$V3F&g_gPK!-<+ur_8J*ZT;WqN3=(BH};rUFYby$mBc0{L$7x1EK0;?W>zR|H8sZr zb5ou(p`kbJJm;BH(|GK3>{^Ug99n$QVz3ha`kxN5&9JWRto)6f^^tRRwIv1nN+R_6 z6%Y(n*S%v<^bLR@eh@3}Nu0{Yv8(e=q7|m4`Oq`an{~$zH1WW@=}%jz4Ha%~;UVo2 zC;y*Ae}0L|H;u;nOm1DGW8FxMKcWo>OZf+rC@nOH*QwE4#ColX{j0WdLBmgvj@!=@ z`p@yJ32iPB2-j%y!MZK3>Z%{fiND#Gw)3xNa1C3I1&Q=DT$}`|*>bNYduhhBAr3oO zQ70yb|E@k+yh}4Bt3Y?sJV+j*+i)OqzCJw`UvgViYV)%MdAr^Wt_Ac0SAWLigXomg zX9d>6?B6!etKGV0zJla!!8%STSSO)m@K>!=@|Fz-`w91fu*a9DeK5jj8=XnL)iZ8O zuyqlcq8pn@=HDp+^gc!AlXvG(Fj1_|4wfCq^j!cDxCikEDm<0In}p7Fk-YkI{cj`SzG|<1U{!H5CnO0LHlEh^byG6jJ|X`)RymeXhw`zNn;K zqXIgvUi#Sbu$Ra0XCxp)k>a+Vw@=X3f2mI9Fmk=cR2zYqeF&@~wXM#Rn71IKST}IL z5Jcy6jU8bXdzoq@`iup)E7x<<+1=>`!`;Nh6y;ZcGdd?n?V-$Lqt9)VnbGeKv}M?j z(I+0NN^}u0T}^C9+fmV{bGqV4Ln^YLi5~S!9s#(s0#a=?@stdnUr=B^_*EM8v;JC$ z8zKRQ@@41WUkYAd$Oyjt(He1kvF;@*aKc4aW20qUI%h%EauEb`iT3< zvreBxr(q!mdAd@n*7PA=Tv5Cu&9BJS&fA3)1|4|tJgL=+7p@%5yMXw4_TkZdtaYW? z&+kXqDK%>&8xzrmR{xE^o5KM9?hv6cQj+zn`XH{PZt3K}Vms~E?HTRjBxm;uJe2Mj z;pBwa)HwvK`ohUQy*d_G?xOHqvHJju#bq)pd(xM*(3e{6bDK9ggW#m;dRq2FgrI+q(WwLFoxAYZ7<6hgUmWwTKeXIitF&&ucy#H5^xof;9>pkLL73<)XE z*_*03E7N7^WCXA@hMDx0q;>1EsvHGfKk#XB$n_kMK5w|9vtVVuSVX>FWXxhVy2ZFQnG$UF zNgh&PcV@%x{d0-T-K+hfyIb!AC}l(5WS8Z}Z&OJ!cz@IXgF#2w*1zJ=AkkXStMnZ4 zIJ%zXQCoPBQWiX}dt}}vs>7QX)|s=L5m((j2K46iz9r5~-Y{=7?O{d_k+Qoy+!ngP z(Qmr<;}fQg9e;1J9cf|Ka1=R{^`@S^E`13{PqMtUOKRp(@M!M#OdJz7EeT4Y*EHs2 zm1UeQvg8edT4ZjoQ)=jIfSxJ>+?ke@RUtCD22maQe@9e?CB-ukWPNPYeIMrzoh!+- z)wv{PKuahLJ~H-fSUOcjmQ?kyW10ZN_Zq-J1Jym6>un)cP(4JnwPU3_ikmh(LB?Z} zeQ2M;tHrc;Vd!YTQzx0`A0X6;ki|FmsH~Cmlw$~02aPma%WwJPd?L1okYN^HXEvqAB!d`}yO=)Ux7vqWF4 zCBYLtp{@-ML0rS)C2hyj<2%W^UmK^sZBg6R4n5AP49k|ofBm_+*~8ybhB!;qK55WE zP;p&xHzPpJ`>OZ=7Ja=K_qZ1QIOgMOURShE9MMN8VIBPgg3|18Kp4P%FbWZJ-n#4I zqpq&LPx7h}Q|qk{Ry+}$lS-utl?fRXqXOwGAJAIHISw*{^Lv`D4-%ew69E-Bg|FX6 zjyO;XlXlimeIjB6PGY+Br3iLCBdJpt6jSxCB+v89#1-FdsX&BeEI)%Yfs_3B3( zALAIB&8nZjo_%=k**qU&F)Mg5-udp~ThP*YJlu4|Mc*%T8;94|`hivmIfN4p<`O{#Hdf6N!YCIt`0P|%v zigKugT>5vW>+>=*{Sy)s&4H#gtEcZN=)%V)Sml8~D}_9w{^z1Vh~Sv~AY}5Vy6`C| zk?t({nlGS=hW_z70EAk)5Rc%9XvIu(H{Pce^+(q%2`BWhiH1*OPd1An&e_hQ@+?}4 zeLHop`ucXRjy-|BpOl{T3K~2a-K%EF`JyuG`APV!j+F==pajfL*RRCqvSb|T+1ZaK z>s>fJ{ED>7{8su>6^)IJNyy3DGsd(mi98FjKzaPt{-4AET+#mv7NJ{;F8AeUmP?2j zZblxRFnz2YI_dwAkYJPZ>>NGA0Qh)-{WL`|eKf64LUsF+!hTrO7sdM}`>h#DM@;EQ zYBN~SsC&p~ zyl{Aoob<&^_R+SwyO;|@R+HNwm+pgY_{Wf1+DyG*R7gsznQ;#lJ)J{4U(1X%TkTB- z46S=_U%$Q+82qyQ6tEUQ{LL{jk+Iy}eh}8dKCn35i_z3n-f`iVFJe63q(9wsBf7*C z9Q67yqo-w(CB)|Eosz=dHL~7F0xzzsNn6+#<9+Q99iBj7F-&)1!g_-<-sf zvv~*RwwEs>CSA`~!XB3smY~@L-@b4h+dMiL6l5;*zT(PEKyY7voN3?R7L+Psw@q6| zEXqP(omibdfqmN*sp}tB*k%z@^yNmq+mY-PEjr=!USpChV^>x$D)!?^Syc4(Pmk#9 zLD}d!8-=*B8aZDQiH9U8R;yfQ&cYDL&5`tTaW!9$wKj4CLzFEbn#<|~lH71|czYZz zG4Y*B2(OKv4>COh9X9uPWQ6~dApu6XZ#a@14k8yV=mIg^$`Y9ad4r5=s(P0e&(OB% z>=B+}Jmv?C{cy;NeSKBU*l7v|=l}PSwSWW*G-;3n)T4S=;2B559)Q+8VnG#Gv*h5O zAs!j)91mQt*fk{lLl%yaQ3O!y_v83$FTpBM{#k`0>bPX&{T)?m&r>G%?VW<78MNN@ z8X*N3GvIdt10}>tP&$;Oh=pxfRaJ$IeLrV z%%8q{WD}|1V=>Xf$Zt=e}JbIsfk`8j{9Mi|$<{L0xVh>V~m#6GZ8XX_MmWXP80{JfZ z?;`=0#0CX_GjW{}dPyeYbcvxeHZ0+=%JI51od0XfPo@%DY`&oX>K8CW9T!I+%W$FO z90w$?3Q>3gmV*GqYOUw4X-IKHaIQ#r7+{r1n+v-YP!uV46{1mM{#BdQfoh`WM)Z6m zr`bXEd1-fG``V$c*Nb4XmB46#Ig$P^VbyvI1wrot*fRC@%edR)W&Y&wR4&uo0G>H( zLZ#S339>Fkd4xoZ!1f^Fm@L)o3Kvb6g|VRUA}chaTXcZYGNOxw%%1&$r2f5-f(Yt4 zsl9Lrq6LelAB?ea#eEa>5hOFsbas0{uch%b-NA#yJAY6a?TPM(NsnX7)@X{4l{0oV20w6Eg z@Y97;c%mQw6at#Se;g!^#WrNM46+N+!(hp;xSY$#bth6 zjabM^^q59m)VDz4pNCx$uD&=hV2eh`zx_5>5_tk->({hS=j||LzBf3JVF!IQ(X#PBGjo zu)QK%M_ibFwAb~q4O`sM=QRMBaE!t3A{x^ReHECevu9t6XLjIck+4LH1R&E{{wX4) z6EiCOM;2We!yXwgc=aR;#eM$#d3=%OkzmNraLQF;IAO5$UtkKrasRxNwJO^im`Dh; zV2ryQ{{TI1k^8Ej(L(#RY6o%~92tGI-Gt& z&}QpNN>cnKZE!%=ojws`9Q{uesDCE`EB+7aAc-_N`*?=2NG~Jj%N;sLiDCtW)RDKF z7Q2=9B{+m^BN!L#cxcv$s9X9Jm9Sa#`iQ04iTOLb&)G>m6nz$3b|lz4dt1#tM{2L0 zC5IA4Zr4)0OU~HQ03EtZxpnM2=lIW>L>a0AvNc8q8WKpkU0NiVe|_RXdbB!*2f#d2 zyZ2Tj%V*WrQ!jwcS~36l>(?*g=_i8Bt&BbsBJj6Fo`0?=2*qk3*t&Z=?i;6gmBo31 zE4|PkhLrDKZOUA3;PY9!r^~65VAB7|BV{@=Ki5`qSJ6h@8TPVY;ZAtsExP;%XbE5k zF^lDNSwR#ehzGvXlh{seNF5oxu(-g)tb%9w6hj619MBn`L+YiX6;gg~dKi83@LVTC zevw1xVgRDJ+(XwXC1RY?Mnk}_e-;_NplY5wCh*vj8Gq}!XK2vL0!qcW!pT<6$Yx=r zniB9NF(U93{CHFx6s!5xK#-UadCK{Qg<-oK0cOM>#2Tb=_7Yu?hEYge~G#M$7?&Z-=3vE z1vMR1ElW!l4{vofH6>tKrCzr82jCcS&wwjK_;=_0|IHl!4QlSdtG9u7HNgkvS1)yS z(rNI}kt=u<+sY_sh=OE}zm7-#H{eJ>Ui3Fq{}+L!_o=d)5^s;BF-5s$2@VTjjm`;t zw$vWJZjA<4q#b*9_iPhUaaz@XuMK1x|Gl4oHrVjLJCeY;8&BPKU-@F{id@KbESv5) zniZH`6dfJ?eE%JLNLW}J0Hw*`d!(k zaOhavFU8VwRC^$geFt8OPf&`CMgGY?ZrT5P*#8yHj1D#>r&I}pFY7>xJoDQ8?%4De zhkRFSACK2!^O46s!7+S~B)Z3=GX0Y>a=QNMLHsAy``eEA7T^$N)F?>8G4$KUE#o(B7GHjs15%yC4K;(5Hmz1)jDn*O*w97_N{+vzpd(Q zlL9vxvF|+g@9rDph0CI|foRMI*XGV_A=9qT+rMIX#iy8mO9eYto8PbJQ*% zZw0-u9qxnb_ArV?T{O9W?El?{_Yh}1pSj}|-Q9tgsb1104d-v%*Mmz2mRV9ct*L~V zykCFnLx52Rj;FsCQO>w3EZ6(VX9w4-8+=Y@KGyEtgKYg;Fi_j=tlzJUmlN3%0E@_G{qr`*jy@!0t_YYzy+QAx!NNu zu*LzUrag4-4eo=6X0YF&n5YNt(1(bx9q->OpvHrN1%FHzFeGeqU8&c%i*lio0&c`; z3k8<3{R9SX;h?sJS9jCWu625zd~+Hsj6Z0@2&g9D{W%6wSmDt7;J?t@QOh^;PEio9 zj=-Ikj^O2!vFLf@xbwYl{d;6{T32L=-JeB~!Xs$J6o5Yiio&qCV!hf{YC|w>EepJP zWPu#du*uFggiL>g~2ip;;xo<({;AL{HB${H!rR*X5! z{{q9>$-Kha%~A9|NEDVIv~j8Uk=(-U^MRlD+aD8ir4K1+SVh%$ef!~!j^?*JA?9cP zB}27csbvs{?QN{wg-6&TJdt|K2j99Q6_gssYURcba@Hm(J{4kfyr}dc_I(#|mFkHy&mtb2mn!mjVuj3d}LcIo9+u=vODiq)x{% zbSLs$L;;);4Nc7oF!)rfArvG5kJ%s9MPY&35@3P|?GgFHE)WCW*L^o%T6hgOj=a%&d`#s-b5WK0&|QF8=+mzS$zIne8axLXY+`)^2MY3}k`#lM-Md47RAkIetu$W>_|029c1XY2!ki+4$A{ty2G!;lXS@+Ht52(R@8MV;q4VNp?%^bj-U`lq4PeuAkk z!HH>XnA2rCC*U1xKhPVIqQUV)W_yW~SI8s@6s^EGn9>vSAGne2lEtokZS6pwOwWoD z1t8EXM}2#SSQ&;oI`aV;1B$EyE2O|&zwZWfgrtgRF0Zy{ui1bWKMcq|@wbC0{XNwCfYDn5 zA0IzrT_LUKRE+kNz?ilt4+cUjBCWAaf0oq2g{-cLOuS84F;{~z| zyPczuIKkAzG5755d92r2T=VO&w9FiVa}0(HFSzr^(yu31%f7|vob}sd@hWcP>{=Mr zedK*kE;hDy|J}pAA4mS!{!87>!qFj$n>-Z=lU5=tMjqZ0?lvqav8#2+&9%pgiCI!n z@e3Aqt1#0zMrB?Le*Mgw7_L{#Q@L4Nvp(IWxjwvq+ro`g3F43yJ1~g_P3IyP%{bvm z%FIEqW;F!By_|ZQ5_=6`pUDK?ixwwYSa=_hBzxR2)Sb=|J>}$ZDNB9xW43tASy}pHILn*c)*{XkGqs-K3S#xiykd^Ny<*=U!?XG1CcMDh zyCY0%rj6g2;%gyb^kgIEIH*{I0D%rEM}!(b74vMrtc-*P5MK<)y8}5SUzCAf4YC$6 z;t>ezj8(i}jGmzqS#IMvKu(le?ur}w@qw7iT4MQP_C_>Rc(pGz2YPcpHd>m#DK-u# zbNe`!*PQ|v@F|S}Q(3u8d*3ShVc?PR`*9=xXcOyG`??KRlv?lQUHH}X>=jjTs@FLa zlHrA{sXGWRBpral<*f&t(^P#;n`alB&DWOKcf(a{(?R}ud8`4sSc*~{Z>kq_^~YER zvM-Ujx=kU?Yi5YCV%uy)gua@VumHT6@9w*H_Tkd@Xrk(3NeEZQXZ`3&_n#aFU-;QM zI!4D*Xi-?xVDE(%IatyfMTVzqlil&TJf;y1E&FxF#fRu8aevq=f5T31GUL+#JdWiU zj-2%<6`={Qu_HzhwWzYW?!oF#zkB3Xdt&xzm8Yh7Z6*MEZtKRfN8i91`N=@W!P5lZ z=D-yG6FQMbug?n5)5pop=b%n;PN9FX#(0Ec%hEd|TQOYw>@1YJUcy$aB8sf%3z(W^ zqjn~i@dp1q;hQo_ce1veYIf{EbS$yscDJOOzqL}dERJ3?S!s%1B3XPNYCE6DjjrSR z5}F#H2WAZ0R@&mOembMZlFqu|jgXk9&!~Fr(2js%kX#guyJj&n%+sa5PqW`h{2=L$T8qf>WBElUeWCCyhdNokE_cb_y5G zHzzmtb!Qg~p&Y~eKQYFGIy0m~1!JZX#g@bka-Pc3t9u@c^_>_AyL^wNUVRa9`4>LS zYm^oqO9n0)`Mvy2w;gVyYCW;Oo?kuc#$@=GH5ihaiqL^L7_)zk^`K5eI}sJ{ zYd)sX_p}!4Y5KL9h=Z00Xonz121CTOXIuN>l4o3%1+Mg)JinyIITxFD*6Cli2HWg0f;6l%Gg3^NYU)Jk z`?-nx&0w%2;<9Ga_EX`h%w-Fp|~YwC~}mDwf+rD8|TKtN27WRf)7e zg1T$7DOn+&*Ym2aPff(PHCFWk_24}r?;oTaRZ{|h2D&oF58a}pmqt`+S2a}>>~DzC z&cTc{>5D#?1OW%)BnpPl8Rr4&(boYdOL;j`$#~TUnrq2kz;eDR{dj<+;R8wO;`;6W4MI71PhUl%2TmL_Nopo4LZ@lei=nex!S}dd`q*K8lrF#Hr22?s`=uiaoCkWC= zOV@yOgVX>+3^SA<(hW1zz}@&e=iYOkbDsOR53|9&XTR_JU2A>TIXR~dYXiuxvkcdT z^m@>LZ!C4{Pjslg{`|G4Em0_`K@5WW#TVxIIlexMr(Y;+`Kr`R$%A=~>Zlxa(asn1b=__O+sYs8!_*b}sdxD6Gq5xXjY zHy+AW_U*Ymy!NM@JgF>Ikc7+drT7efsOKOwl&>(LeyCxu0{;Y5wP3b2RlQ6`A{@%c zo5&=;Q))q6T(>Skp)3q+HL-uG<;;R+I~u{A)peIM#kZAybPZR1sB*B^?_b8C14t`{ z@)g^8*5}SQ=NwKBR?m=L*pt(VWVyjbiEbW zOv!;o_{J3eo|9=5UsD|-ff%+GQ9mO|;?&i)1?B}{STgukx+ztnrdr2y@QUR$CgQHi zT-~R)dw2Jm%|WILc(C;7!4Kp_tX7WHVg}s}*+HcI_>Q~nB(Qr<#M%jM+Xqu)v7L7i zHIMHA_krA=hemB0Rosnl4z05_O^KU&H z&L6H1=Ovy+kGY>@Pp)hP|7dM#coze{JE4$^Y1Iqyq`BAen)2oU$f4`g zi5xMLlSJrOP723T?9RRAxC)1JwaHpCBR)W8R>S6b&X6fl+y%yrg*9pE{#!qSp6p;T z7_^E5FaY_zTX5Q&+d{PJ<-HANI*Z$hA&SenAhcXOk^{s<{_0;sz&qC2C#wl}H2d3= z=+!avMl zfH&JwpLM08Dr0zG;7;(8$DN=%dMMa7TwOu3Jj6~jO(~&hE8l*|{4jw&4=SUPsHLEE z=x+D@gnsx%;#@wt6A?0luOv9u9G1ahDf9V#^mE_VWLMMmKJjIFY44@$Ye_P?{skI+ zxLl1nc!c1EQG%sZXr8{rXm-9rmLaC!L*AM346h}x*zXcOuVBFpq#zEdAS-j~p3Q(- zlTjb{y^hcoUxX7N>DVM&Q6BTqc|E)Tyiq<{u$?yY2~^o~%lh@!jRofO4Wu!k+=H9Ui8mTl z{SBvNEBUv-&xfx7_?ydR|IV}H1hIT4vfMidmW-JSl#teh+9+JAPvk6N{$`r5>pdtO ztw8z@3S~E19~t;KUnt-)^PG$tlFjVd6QxOYxzq6oU zFFcHYl@PpVD7QnE7`WSx^;kG3dr%W?@3>TbKJwXv?6Ac>g3hfd&*d{7=!5(L{OL`q ziD}N9=9vWdVreSF(T;qDZ_b?OVS;Hg%H(vGje_9flPtdP(^vI`qUWi(fl=zjbXLCN z`B9I8-CzGwAXkJU$-a;5HO@%!R_mWL;g`VnHL< z0%7ig;Hgmq{yWd|pqB@YVuh3~;y_IN@LyUa~nt{8_fo(lYudY&E zy{k^Kv(}ygwC>rPxVwvLDOF!^)9+#WsjgF)0UCtIwHC!^&nShG>5)=2eV5&iC)o-o zJo1y8ONW5_1DH(6h2m-8E-R}@Sx$exAgOnjM}OzizwZ9$fNlew|Ln_ z_t6VXqq})xO?A7kb>U!VzMYx4)@^QxP1fh*#Z-5->c--_$s;~Dpa8t=_|WpaKk(OL zO}@F1Lq9O`{9&<=2b$A%4?3>%8I;c-T%6BcRJ}Y4>~$ACVLbGxy)WO`%++qSDHQb@ zXe&sxk!k|8IzZ!`4UX$S1NQa}hqpJ*@PNhrq`4c*3NGf`r4IaiL#JQ;r})U8=ntOR z7tHen9zRQ;$aFa)HBy2PRhe)(V3S`*YxZQoG50P9?nOmKz5=`f+`{s+TA#urro_b%eb%^pWf$m`2-LX z*TK;k8G-k4ajcnTuU#+Z>Cc0JmBL+RS@YlDJyb|kn(!<1_K|d1#X4{$&9io3-vivP zM=bwstXbYIuz7HR(mDn-En);PkOja6ySMK=2?SU|M&E!}^WD3ZASQP9nR~iiX%qkv z8}jd==VYS_X>?6=J$y!e_})&z`X;BmVvww+t+@~Yl?O*JEOwAdMm`NCH-f{@Jp&0N zf5QpN4vlAf{Szqd3#${Eyr&rG4v+4RngxyA|9oiv6+b4XCzP}lfQ`$gf&a->_3>d2 z$S#okd_q~ONH6RXI7xJ)@kjIVA68)YLlXrAWGssPBU-#?eIq5Hm@&ZjlMFgt2g430 z0|}F6THb->N*U4#Z+PZYAtv`^`$0_2kCu6X+7@Ij%41afuPDGRCOpWfi`$Ll{iHeD zvh%zMz%!O-uXxsO$OQ-UV#l#OMm_E^_9sj#*TK0*Y%`x0X1)<|E-wvOjq3+|8t4R_kK*pQ2m@)#|$vw!693)w$kj$OAZ)Ih55E*zBIiYiS z7U|h@DMA{30YpCt(XAw1+15x0CLs$phR7w#`QvHU@>DR1kW3R{m>QlFbTq*Zl>KhT zYh6B{WMX#Zcm7JN7l5?tl068_Yi=|v)a&*oY6{?T$C{d$6f`!bZq=^~0ty4^ z!_sJ80FV_y!*WYG_ENd|-*k>-aDQ0gLYMq$Cg;eVJMZFrNH2Sk1iZp19syhY|H_*8OhJrRWUHUX+f^`SCTbk`m-b7Uj` zMq?z)4RfF9vn*t6(ECh7&R0v(t|YVAtzPVyJx6R;whhFTCFo_j|hapxQcF)}L|ExIF&Pz}FYyQjWo^1OSxo z%5LGQ5&s|V`37JaDO&|z%P$%WS3(`fMgkIsgo=Kh_u~E7plv10tuGxhHdsff^SkRn zNTPx9#01ok5RgxV{vvTs_4})+J%wd(W5DslGB5%N4%r&E5gAqXybu}Dx#mU***T|T zYVG`26eI(ZE{EI=IJV6EbYFQcSHw*=g|ijzJY^^r6)Oh|@!FQU!QfqV1JFwCyad=! z7EGmQ?uJZ4+G!B3BtAcXBTdw+>@~AOR%^gSH%9O3^JlSi{Qz2XxZP&?0o|I;Hc%}@ z%{vOj6vYRX-*oW_7u@vCke@n~Zff*kxqfG5|IgdR;aCB~)#LE>)u-z+2dnAs9^c^t z8i*lht<`4fx0uyIL0~2xIc8YGE++N#_M1Bzxi$Ui+4~KGqxlV5BYd7k4&O^sw=fyT zZ)98d`wX@E?fPohRx990b&TG{EpzR|z{bVfa)wnwZv|LScR8UQyDiVk%FLeR8W5Tv zP8W`i`6LXD$CGxtn_!5f(H`&Rr%yT3++1=I*K18c`@>_A2-Nq%aD$aVi@ND4z4I|I zlSW4-fq=Y(WG&aM>;CrI^-UK|zG9x<#NuZKX%fx#pT1OUX6daT$?;7N|9Rx?@olM> zZ4akR<33oNb*Lqf`y&!lu!@#_U{)PJ(S%4?OQz;+>$7}Y-eI}5>l@DzaQ@G}!(MDn zH7>!+3GR7S04oyu@E_==mO!TC>4a`a(Ps6pCA;rXUP^})zJ{mCuJ5Hj$8TJUl>m zmJi+{5M7=ejZi0)VyuA64n*&0BH`06k`s2su9Jt(*NkL*z$z`rMm$ z7U|hdVSdl?(eS(92)>&s4vV_c z1s09bc>m2*7!nW*RaKw$l1>F{Xz%f$Rv7<^miV>w(8iZQggZ)je)^83UFv zq1R0u5TGq~msgCBj{`L0_4p!rA3hv_K1`czo1%)}uz6sU6!Y$7? zi+sAi9iu1Td`PfpP~4t;+xRY}2+Chh&t!tqCl=#eAMoHS&$+~oO zSDKoLW_%IU;}R=?MrDkWZ6Le08{XE5bs0grOo&DzM;dT`dIak4ao^8ZXWke9Kvsoq&^2=MhrpX^ zF!M9$i=Hxy+2CYiuB~2qhl20t27&9$fSbsOi}Gh-yvx2(VX1#g>Db^hlxHUuNW7T* zN8-gl!F5FwB_QKN^7aS*~)`D&@b!}FLZqbYX#IY{N$aAj&w&spK?mvKuPCD4oP z)X|5@55=RNouAh;egGi?(gf*4UXC@kjQW`P;DVvk1hPRHJ0PIsmA z6)QnFYg+&5>l^6jFVT zI42l%xOLRfeu*3u4%eZ!c)|H25+_?efU$f`D>VJWec7?C;?2H+-`>xAzEnB8piof6 zVGFQxQUR=WmnM~%_uuO3l0fw3>x``twCu`TN0JW&_#xcRGiwReg^ujdsk>nK5;! z0Bd1Qu5raDjD*`aoIpy!AQ5&m#k9c2nHq|%H%2+3+dW)#R;gUv+;pqm^nV#3+RkHf z26pypMKvu6wT#J7J5$!p*;&m7M9t~m#>+QkIU)~WhH9+KQ%y~wxXo!ze=iSV|Iqds zCVwv%)aiqZW^);bvc5(7TK77&gc|Q<2~3MWd7>`_safy8?J6Avvvr5yHKpt9ne&M^ zh|vx*IefS+>#eEU6g*6@-PC=2qLtA?5fO$&K|o|Lgc&Tqu66a%$-N#R&P94eOXa zf)fVv4SI)K$}-FODv40Rj^TJ3p-a07_FcRjupRj{t>BM3Z&JILz`rL?w2Bb57z&+vaa@L%a@`%G4N0%dxieWr?-vkU&>Ircvk2xL8EOV}k^VgZ1 zEa=$Smm6B~XPJ(+|3Jh&x>c)a5f+8Q*T+6WGQw4jk+*)=Zj1KO?f#MKURq@N);E7L zCZVvtV^*!Oc&*v~Hey_K>^!wg)X1%9xfnBnG+qBugd23fDRD9tZGTLssfMwDGrKI> z%eKlZqZg#yT4k)ts16%cLh&&dFzX(_Wv;Y2UB4832|fYtZM-eoxV@tZEKpF?FYFvR zV7o^G&grVVjihVz-{t6TxO~TOqD;ZXHmB)=q{2J{B+<`+bHKgbl@FTBFdrY|)wZSJ z68n%RybUFRY5Xnazmd*y^bRVDX`0Zn&2nlDxj(BOY(r4@Qe?)^DL(`58-EJ>Xc(6I zG;`f<7|0@i)XLT0cYK*l0ht*AcoJjn0v_Ksp(n2{?wqi()vaBHd}wvI{$i<^q~rci zvq^2G;cCP>b8FvfdMy2lk@4hly>rX26Vmbrem=|o2S?Wer+=?;jvB_$#t#rZUtTOT zdHY44mI(y#tRAeKLlake#R89O{b?67My$UrN%=}IeA!QL@cuWI;*#mu=xvgMMNmYZwNm&iWjR=`pe~1s{72C4@6z2P_mq zzb!O>=*KI<9SnFAyB~W4S_ew`NG0Ap`O()u@rgRHnU|P?Qr{?x6z(0Uk(L0fo`QIZ z;b{yF?vdyNx`H}^6p7&pjX^eq>xA;uM2yA*%`O|$++aX4l?n?YlL?evka#Kc_~Buk zf8VQj=UjTUY>^=l!$)YHyh>6 zU-}gsK}39wMwkmzv66?t7qn4@N%C}acPdiuaH%e#h*{*yt#)Y~ol?T3Y~z#?X2>8P ztKIU&k6woIad=o+LTz5#;WW(cgu98QNPARrs&FhXK8mgcr_V-2*^|KwP&9NJYA`}M1*3PYdmaWZ*M_%X_Z-u>Enp3>$ z@P?hd{)i@)SL+5ETh4jY*2vzJ+ZHcT|Y-x{u8Rp%?5j)q~N|<)dPYSZTbejPb-`)Z1;a$wPJ>vKt zTTZmi6pv6RD=c8zb>2C#lzG)5vBDR$lm!dI2Ep}uO8X{`Jy_uW3ia#`p)GVXTJ-?} ze^zYfVV*9{0WL-TPuQEA4IEF*6mu#z>Re#w9>)lGE3Cw+gMxBk+Qf0~i4k@UW}Ya& zoyT@H?yR1FrpMuGsm%c=wh(3$y51XaTk1=^!GMXoo=KBIi+PnsEpW8)dq4UVgwObq zv5C+6p~kS>QcJ);8f9GeH<*Vbw%pB2580GB66iirVNb2H7e19{=&TvrbvYtTJy-m! zLYMES8&7NMGKbySXVW`wcrrC_{C=5FK~%uV?4@mzz0ifC^%OTr0W;E~kzA4%C$pp8 z6L-%f>S6npXibSDb}MieP|QtHAP z95Zj;!5gb%AM70-v__oNx&mX5eB9{rF~FzoVSj;hgg>s1;nQN!)gLK8gLQHJ%8ObvQb%B zjetu*olLY+Zq}@j?mFu(O0(xXSj@F97*RhKshJzC*4!-1X5x7db+H~9h{bV}l2<#W zJQ3h1PgW|oWDAX9@knkH!VobsVC{CG$n5oDYgV#G*?9zQ>!(;TnjK@kT}p_F*(kBE zT;`-h+f({2LMTkGcaj(`Q0L&r*hK#eWF5gI9}uEE++0Y^A<*mWvO$72K2~pJsycH- zKT>|jq*t93DhZ>>Bh-KJ$FV4BFN^xtxkkycm66`~E#g^~Rv8&HCoeoxJ(xpYZD}?1 zPL3W!wF{J#k>zx3!TSYoXc`ib68yIu{dEyjY6Yh%JzpE~>|?7YK95sX^ZC@-&GP8p zq)WwlLX-9?knOak#QhWS4fLPpn!X0p!_c43Bpy9?u@zwSA{G#fDF% zW!?hUvgOdrZ;x*(8vijm_%Up|vQD`ic^Zl;IaQr%rNc9CsZ38wX9!-!=CNJKE5ibB z4#1pT%AqYt&(zAQH8JE(SrrERbdhGsu5@;jgC0>TBnRB$msFU20_G9&3RAY^tn6HI z<@Hqh1*R~5+m2h;)AJ|Xq5xt!I32#oX0+-0 z)pIxFD0iOo+mRghHZb1~d9oA7uE5Cf=u{dw3155f@+Q_gPMk18q2Fe$bswPUlw6g2 zudlhPxe1XG5IZ!odjwtQ723uR-)l=cyA?KLkp!L`{8sA>fSUfOw=lMjJ{tWQDx{NA zW5Al{BT#}bQ?eyVpXZI`!~-~|99FKNw5DgeT<-bXSy#oyWl1aZaja&xkGz4%6p z{}aPtF&FuYUIKuaF%QsV7m=Sorm3*}I6sFpBrnNPK`2?i{@x|aoBK<_J85~kUQ(Ke z8T{OkLFAaSU^KFLtv5X`V=*nZObyKcn(Eb6+16P3XKszVWM!8`n%G!6Thq2%H?)F3 zcBpWyGQ9`~@bUT`Td7ulm`Dir{j=Bj+Qi?h!os}@EXq}Hxp>g?G zx@QHkfe$_ky&dJi7TLx?A6wnTqUflk5e+Fvh01JxnrBTdgqpkZ(Vqzmi`lkwgvyKV zbU=n_1b?sziViolJ?gC{OTH_Ha@LMu8lU&g>blPn_CQ8%xC^2iZ5Q<@)QskpP9zHh zPp6_W))Uxrt5^)><37bo(v(+}tdAV7`IvvHIHYg)KI$YAAaT%XqnWk}eaJ1nqEv6G zD17MnsUzxHJzFR1n|DvH76ph7KRV6RJVo%bo~n|J5WQ#8SI2Jn(!fmx;5SS^4{g@O zwpqpsqR{AI_7lZuPB^RXqaa#kclB;E=m->tecR~7tjw0}7%KmV{Xra4%Ezs%xdAW; zdq#UTsf6mv!=!p`CKq+q4eP6YqYDfOf^~9BQyxL`ZlLK$*M$)>-9%n;SQeI))tx;_ zew5&dc_qA?CsbGRovsSH7D5r>^EsmOja(INBG}(N;%BxBtSQ+ae7GvH3RmmBb#;!_ zL|DSMO><7|#4oIgG3vncmG3Lwa%f*?b8}0H|HsV(xdG(O=D0(c!3}}__zPPTbfNayRqFeS1;3_ z@#^W%GXhR@owm_WQcN&t9)9#+>7d4QBj-}uS*ApYa6Fa&)lDHH-`1zJL3zbvo{~w@ zv%F!?g~;fm0NStnxeb_CyZGc}KqA8&l12xu?%NV0eYjFrFIbg=keXn=!ORtO_&POG zog?yX_<0O$*t4lMyUi8~M5Sdvj#&otR|S&3h2L57;PDACi~{}XSxVQ6+iHBA|Ajx> z*w`y7Kh&j-PuL(?5PrEoJAIfSU_SjQPtv<~F3T zv&o@e3+mR<^6KhC*d|^Tgo@tK%8vb0p$X7@1a`HB!q~oO-3I~(3QD70cVaG|a z+p4z7$`Hp8dY?Tq_>*Q8eSNiL#ITFA@bIWns6;|6IEf_*JeR56#iG-n!=e;TTE3a| zrLgIiItQ@-XyPpf-yii%X8ci|PeBjy_Bv{m@~FRV4Js!4VaMQ1_5)2nJwfc+;*&@I zLz=^j3`%|gGNms#oHvP9M^A*pT8x6*q(?pK$-aR{4>K*J$)lE)TJF%47eFW(xDy@C-gd8- zC(}hR<#<>oi_LJ%&~31OA|+UzpaM6}A8N4Y1;qQ;CLr0Wn8wZsuTIo^rj$}!2GOdi zEdnMh?IOt@f-1SY&4re^>o%y>yJbqtaZzy zQ{%@uY`*2<>?n`@``aD-b{Z2c0c`9=-)x7WFYEBI;mBCJRIR28B9{uiu zO9dJrXq!oU{hvQlT={D38#T09|JahF@wp|t?6Zb_F71IVa&NQTj9HjKP#InGGd#1Y z=WUH_PtSWRGc(MqmsJsJfL7>K*>bjpaSOUZJWeq5I9{LJnN;`JZ?V4%{T}$~ zvXp{z+b1F2Trz`{#oQH1gx=FnluiKfw&bM;;U35cPE_RSY&NyV=2-I{&Y1WE^yR)I zCf##v$4N%~!huI%Gf8zdZ75J8;lD#o`BP6vQU4#RDJr!^Ho3A&sdjr@L$B7I%+|-n zGlyxo8n!M4>!6p=-t4}zhsJ)?eVz~p^h2<2j_s_-CjaPBAbq*K-L>oO86Zai;SU)s z$t`3}tRO@TmUwKSMWj8~;@xP=OH6A=+ry~|Kn~p}=!tgqogni#a-*M}0f3N^BUjI5 zSJ9dq1j-X8x&aJV^18`zbg1@3Qh#5^ZNVs0)r~!kd_7xkb7~_vBlQK^8BB9gy_n&% zS(1CPS{o*?&I#urd2Jy_U?ipz6$mG1mUY;<=!*>|?-b^VT5XG>6LHw3d?h>F+WMqt z-SY6T?Dz&6lKF~ENxF=KW)+;oR6PLsKq?$7y6{EZXrFfaK=DJr{!-fnP2E8dgJSP! zsI(}2U8Bs&vS=6WZiE+KrN`f1y zWK+F13l(l;Theiyx^$zEt5LA>Ew!E$51zXYzbH=gXiaE#@>yA#SdCuoOy-7@3!Dgl zX|)}#k<7w#cb5;_Os)D67KoLZLiOOKx=`mgUE7qe$iGoiKR4h&RP~9YpRk41!+Fk+ zNE1(S+kaMLRM8>`v;-8j+fc$A?Z^ILj9N=_Q$IIurg}2IZRzbrfnQRiyD-@kwxmVv;}Th~-MD^z--@z06)YG1$tXu0 z?qoDzw_ZR}Rbb(3V;)@~Td7)DZzQ5JZQE~D!emFqf0zy>;SN1UQl4C~&4hQd>rIwl zaO_&*&B!g8?My>GE}C+-+0$_jxnIvtHT#pt2W?Yxd3X<`jGwW61}QU0@u< zF9&ybVu8hlkx1Ypbab0JVQ3-gflAAMv3KTsl){8V)`wbsX%Zo(?wv)3Xp5WsHVm`Q zcQr4wx#kG~kfNyWK=Z+aukF|beQGwS|F=iFIM+Mol$wu}E#rA<qhxWS{}?T<~Uu0QAz%27nTQ{1#Ak3bd!_=<6p`7G?ha{R*(l<*yV_ynnx8 z0a|xuJS*%9ul8Dcn{kgh+H#%MqabK!e5^d;CaXc!4ZFsU1HGpdrt7d(jPAf5olTZ{ zVx;3g3@sny_8*-z^&A{LJyVAI1{*uLiCvUUDpJ2ndRTbT_Q;FkQ-otex&0e;!Xo{z ze!TM!QWu7syU|^u;%MQPA-5Vbwm*|Toi^I-%B+YICF(s7mkKgIgGRT^&QNxm)M7B5 z3zUnF_%0bSuec=YxTXoGjIvHOe=OSm6#@7JHoG8?OU$wHa@4jZ&4{B(5tOIZ>t$l! zx(x$ohJtk^2eQH&Ae-{SNg2^&Mua1h);3g0h-|c*$uUosXEcl7Je`Bz=3_sxA?e1j z#BY&MXnc5^_$0K3($hve`fc@5F8TD0fet!b?rCRQ>o+uhA6>)10#uOU4b~)LS5^{I zDDeoa}H5>g&M*Nb5Wy`z|*Xyj! zI)e{sg{bQBz<@OqYgSlOmcX<`^^0JiIl{O3bL~~~;;!i*b9%lf811FZ=`=qqTalCm z>fX~u_wO68OV<1~5_$-QBCyOd$4%03n@Q+&?&yIWNJg`^G;ms_&QM3*W$;Ib{G9!R z8KJvb>adM~i-L1ymZyu$QC(ZmdRVz=>%{b;OTO|3j{+ud+ZXM*vmY7GCEF5!yhE5) zc1YK_ucE-Zdp3&b?SQHR_fT23%*QY5d5@@>LcghpRKSPtgMD;8U{(T6&;Cs$gup}Q zGN`7#Q~aCLc1)DhwqicazNRk{mt-%48zJ$qCyOCtt^AbsAtu*^&XRiM*?ffH>3L;5Y%((LaT&3LBBX{RX(4SV|@a_8TiCI z5UVDkGxw%E_?;3XM7#mNx$`GJJmJrlLS>ZB+Cq&qa?EZ~- z#gER~yR=1yPVwxIWuokFd{Asvjv^cu8NOjzpIl+^DoIJ9T#vRI4gsu*0xKzb5jFg0 z;w9!Co(@*D5`I~Wo6r7XlZNE{ukCci>`_Mi(!9b99b9CNv z^N&?J>+lWQ>{gX)ZOf$e;=g7b`nw<#^>f*3R2Wtb4DMiDqnsBlHKIu)`#Zp{D0rtQx(~q1auv zM8PuiDF?UPQM@Z|sao;2WXXK;T&RkQ_#m8~TE!EY;*dE}ylX{X`X?L57!J*yy1Nrds;d=xC)p*K(>S zcR%`6lU)H{@*otO7fX)6Ny1N|!ygaS(t7j1+<|=y_nEFDAOG6{Ln>AtKJ;ye4-yb4&M;UW&7ooT86$(`0g)<=ZWo!des|U zdEjoMP^9zdgnYGp$=PCaaVF@%^Ff$g`lOHGFDXc;K%@W1X0LH7PIOO2wgRLBpR<UANR7r4W*3MQrDl>Ce3=Gm2c>FEry-p;%@`T3ajhy)Kr^Il^P+!48B)B0X1k) zq^D12bP53m?qSP+4YxA%a&PNQ{|mTnGEs2)hUT*R4WqCvFiwmbAk!aDn7Zk}U~&nG ziB%L|l9Qj8`Y;2`b?wJTB!A)EKn$&x2z~I+Et9fya1V&w`U}TKG5($9jbgD9R4CI% zRd3FDMI`(AuATp()+1`8wG5B5MPw+y^E?S7Q7Gq`du%XA^UGXvxb*MUfBFotM#Rec zWN?ulNT?11oE1XeGNH&pObKxj&g_!t>jWv&2OYMKp%*?MvO8riU=4|x(QRa*>=Y^t zFyWOpc^41(=4!YY4M?Q-A+acjdZ7$f185f`~LR|VH7N6qVwWJOk_1t zY6T()jLlCPIG};Grr^gByQ&q~omOmRs2mv%m@9h4u(Wpct0qzhQxOF%vA?3^+$gab zCui*Zt>z1d6yHL;Z&Q&fpm$_|`A}t4D#@NOWFZc-!*4c~^zUgA7Rzpb_bHuBEXCL)4C>-OX7rED zqbtf<27FrWdv?UsiZm@bW`xjcG6AOs)1i1HTP|}e*|CA$RmV@#ae`_!oVvHJccDRw8zVaLcV7>Pl(dIK^rdplA<_biL~cQPg^^VvgcYbI(msTq;N#z zwBq{?zF8fRp3WF0sWX=O*%E z?-1Nwl@o&uiVygAIC%t#2p`9>k?i4=@w{B#tgny4LX-WhqfgIn!?<6W^5af=vNMjE z-^@#wod$oAO8=FzQ)dhyY|0d^seb3aNOV~2juCVJqt4WN2>=IJLI4~mxV@tTpa<5c zoKxf_v=Y07BZU8_)-hzwa_(#BqH~(UU0mTE_dqS-hb_5JJ9k%(ojPW-WRqH_6iYRFsjU?S_kM zt+E#(+4-KUO0|}+MQv}&gsCzF8PbxF@mx{7CL9{jAfVj28qjS)4OYz@{zlSC0qxm* z3{U8Ger$Y9SgHT`M~{;;<-MqNSg8u}?ttKz*1HgsG%AhypGc_w%0rLFir}PBAD+A< zD9^`C=%2cgjCxuVwowE_s5af+3WB@Lk@_(!k2JStq^d_qP)^tFC>t}xR4pb52BjW( zE>ur1b0Ci8nnf$0Ei?u%Up=Ocdc?g)f{&gVLT5J4zx_bV$-_y{G&gCxD*GK?v^^5p zTpw_FtYo}m11&mL@8M?0-BhO>pNwdsL0fT#e3W7e+c8mT%G*4Fk1mh=ev;Zed2mS1 z5b1vf37W3GuQF$PA_*x{F;Ax)guUMzW@6uNnPj}hK_bt}g;@7+-_C~HL_-OwBS=Qs zi~-TRM^h0n^s3K`*9*(3#&xqNZAx;?hx;!TWTqzkzEm>U_33*iiOsni=c<&q@83Y$ zZUDQ4^yR1a+GX$6C|C(>wXbbBy5!oZ z#Z_KPzmuir*%K26Ce;p%TEXhiHS^GQlJ8?b^WeFQ{A|k2U5S zr|2Pru7P&**Vz!UG3aOv^Ub^-hlcU70(7}+OuAFAuKhJy=VEO)mCn$DNZ!OC{AT&Q zy>GLz7sJ-;MmD#S(1 z5&N|=$Zh_raGeg~KI(yYRfyc0gm}g4sNid4+B@BgXMG&j8M~vXZ<(B%Gj_f_J6r=d zqj*g>9U&UtqK*c~-PFOgC61P$T|Y?VYS5Ru-j!gk(E~Lq4+|P)81BBxCNYg3_ub@1 zw(mYPw-1AEtdl6c)(h2le(gk7fUPB?gGgyY_gh&Iy>7G-KU~H+Hr&|~OPUnw0!(3E z)oJYydaApk5+RA=TxyNrW8q`LEN{?1TN%v!+iOeocg;eHN9Xazbp{%)S4oQ^$`RX*M|&8I z)6(*J#VEvn!5b4xJ^ST8H7pphe!>tZiy1PE8<&^A>&!`T7z#zI0wdb0p%f{DBDQ$P zM*r6Wz_h^?YCoR6lNgO~$Rf3UdlP#yvb3@e>ghOrx+vMAZQVECQ;eEY-4t~)wPZG6 z+cUw_?s2{Pm9g!{j>LcQ4E!oR&@_a9sC9kZ%OrKg@ytcomysTD%b+doUEDOwncI)ilH_iwZu@bKDLB;?fo(vLY9 zcOj;CCcs~AGj}eg<<0t^ZM|IK%_=%3(oDn9 zI#C!HyUQnX-u5Vjxm98PNR4wnOR@E#g%v}p*EZ%^oZLAHyZqbEo-CEf)!|=2G3LG1 z-p^X2pS3u0c?{Ta8a|J^cuKCW0Y*f*Zio!mdD3-zXvd484I9(^^&PaX*0J&qKm|bQ zYVk2VfVho@{PMVNee?TNAXOG7@Z{)CjQ$rPy*E8^3LUb9YR$ltI$JlSy<+P1z%!Nv z@+`R-BFA|azA)NJo45{K6>_)=DPQCh3q;_h=rVLp^VD-}ICt;Tw&H$VjktQizpTIO zWQjGEAhWgEAXp6YCujKE*M(z}g)r?TzKu-$u_vRX*fH)aT` z3b)}?p%o~iwr~ESzHGTm3@v89s-`bcX$p*3++-%4GJ#LOH`NC;#Z)s}2I%xu&?=kf z#nuANw-XYh!P`f}uH*F0doW+3b)q(`**!$bThIET?0yg?ees9p_@qJL5nwrYV-IbS zg~{dx4tVYOiXhGdsQfRC9BzpC1rpW_wm&k)jsvRcK<|M=OluqsG%AjO0BG>j=& zuDb=EALB}v&04EamHR!b_JRs3`mzd0DAH<9-lfD|QUSj!SiYC7KIi{9{Dj?|f8HGA z4{u5GRv-4K;BHwAnN?~QD^d^pWA4y{x2Tzo24S1MzaPTK9Hsw0qF`G3>QQ%6($0JN zN2bpL9YVP%=H!f}NX5M28nvxt$Q}Llo2$Hs^!yW`hS$G{07mM_$gdQl)m=qUv_05m z`sfW9NKyKa73efEw;HUAx1ya3e+q^Cnsj7pT{ApFSovQN(~lz07q?Mm=f5mh+%Cc| ziJM9*J^z9rfjT3F%VglcJwh{M11&cJ`ZBtzHCjK@eTezbe(lvRNdG1&kP-kqLfG&2udm?Ie9Y#1i5)_;_AXNI|9w=FyZ!PQymg>K>fbCiD>S-Tiu8KopLOz zbyBGm*YA-STXuh$%EsvA8;Qwlu<>eXn;4r%r_!3j@3Zx7W)9QuL|^dL0@Xg0zPrE9 z`)*c`837F-c(uB=b`N^A0g3;l=A4jn^_n!DWu_nEm_p=$ypp-8qpBmWJ6IgwGJIZEMBYYGp}-ZM=R*$#>Jbgh30!m0W#h4^94w`*!)g zIwl@g`C^JIk)X}gqaaz_LJW4TsEjdB0i31-t@j6FZ|a_M{>Dz7(|>K#L~>e!dwG4V zc((-79x-eBlr>MT)TH^niQaVH8DH9G1loVBNM}7y-KxpW%`}w^y||-vjRU|E>vx64 zC2Gq`yT=4*mquTv@g}I~1|Rtu@Wla5dX~wZ((7My+BT@Tl-Xt!)@cof`*CIG#`nji z%7o-G_2wjv@YaJQ2ZXL1pLH=MSg6U!%OIf=hb+6ZX^$uGZ8+iF zyXC4}U77TIC$(VXuQJsk0@k~MzJ4UtNsCJ>K_g74s!P(_OT6yK_UDu(bxb6OL_&7r zoinf?ex@nlyiZ7ETZ+M>g2U8ota9?OC#L%%`MFP2M)Q=?t_#$szIPzX^sg1Go`FF- zD42kA+Jx%{WCl zPW%Hz$q-bs+@O|BNV$TTSk+u$gcQHP#Q`-0&g6vnd)55tJeFnVPm*4Asj^2GOXzmX zyNdnm)giwznQ`jfhE2+b>j^kV9bWPNm`#>d-Ujn*uF@GTLEU`Z4_@kg{8U*#P4_+e zW5d#>6+VQI=+aQrCP<}VM0%NMc@N!qY-P;T!^iN{^=o#3q4x{tJZwi=HZ}p3i=D^c z6dxO5(=nIWz!{fPaugfwYFMIR2`CEEZ0E zDkX%{zVnjPf(P5_Z2D+fY5r*ZhpODVj}oS77VM)XHU^`DR(&G#kQ=9@25`uJGZZ{3 z-kfhSC~?Y4C-rjmm(Ebh(3rRWT^W|YXX{eF17yR_gll1SI29Z)pEEK$yb)0End_3i zIT&I0(D<5@1(Cj~_E1AwOt%cOq+zPS;EcSl+)c2NE`b~@64kNCM23~_0A)L;=a?U5 z%`GXn!w1uR((g$0_TyJ8`8HQ0Vw>GQ+B<*@2&G@Agfd%O(93s^Nd+|j;*Z{2?#l;l zfHxt`%UK}$LCpVXTa(igB!+OxwcKFQoln*uo*dlRgN7`#*iMwENff(e^jt1`@KyZu z7$=>8IOx-OJ}aRJz8OEZAe1{rl2?rkp^417&AFhTQQ6A+DO2F=6h)DVH1=n$d%ecg z(cJ0Kd5P>F_Y{l%ii8&{Y5-jg;pC-Yhl|`^iObY@qVz`ar2~rD2Bp8*!Ev2FG%@ui zokgCoWVOx}x`#~{T6%>{A1&qzx<5U9;QQ77U0)3^D1`n6c&6sQC-Z3B6r5CBbpf9$ z&wo*BOq(*3()@Q-r2}wcsW5mNMR|Ms!({L?BkY#RxJUz*`R>&TMicMt^pEOx?;|++uMrI9(z5P& zPjjvXAQ$mxt2pGeEb>VeJ|I>!L+$bu?r5wZ^MCC5aGIT+zWrgRZ~qM0?`CS^e0b!m zWC;Go=5rb_ZOwLhm!(lms}FAc{ly&`GsW+QDTPH5vcWHl>ZG9KN|Oh3#=iU2l4N(Q zUK!NdY1#xNfU>}RFyp==SFv~NG@3&EJ+?2)-K~BBdEaUA5I;tGBeYqklD;La!MmPf z7w^O&T&9ME&)eZ%qABY88)H0+S7j+c?QX`GT|3;f!^b8mZVo^6F|odCeka#+kvp6= zjVEMk=yL7q?mB1C^!>FO=>9zk%IP4Uy9=u6pu2fDb74V2X2Vu}1mlGZH$g7T!zj)N zZQ))-+Gi@z@nm1-mT|gbA2Kb!>G5%elnFY=rgw&Rx0>o+ag-ETsKWpH$$;!#iGPBG zh|Cp`*{5MF7Hn7x$|zs{9Af(LWyIP?0wVB>*-Y!Dqb44>{UF2x7QSThfkK3T1x$hz^E(C_p{Wt4PIdxy&9q6#ou^w6ic8X*y zBS43o36?4hXbGJHJpXx|Cy*w!ya&u1A8E0 zjGLMe3fe4=d|+Sgyrygfgix`Lo_dwemMQcmiH3vG#ArLX-v%@%zxWFUlC*jbi%P9o5~gm6$&UrQX$4<2cF#;9n5ROZ@3SsDrEzIz`8#^*Yl2az&UPdFfuD zP}~MTmkSIkve;jkF<4DNLl zW6So4axsZQOT?dvaXqNSyzXl7gJZHYg+>3qwju~LvUoMvu> z{<*tauh z{@V)*mNRYt$0O5Um+arkPtODWg10Y%NN~`cRL{&z17ym@f=w|H2=qXx0bpifVHrIA zZO{6s_IlojclT z14(`4ibq?j8X92um70OFkB^q26+puo>r8n@;Ss z7$Zsl1TTZUde9QKv||%-zj0Vj^)015<{Rh6J%%Tz#2v z;xh@tUPt9B7hFdfemLZWwID7C5Jup5(&ar6HZ^_rpVCA7e`EE42F7)v6rimqzlW=? z@*GhE4=z#|{IMsFw}CgZ`6Ss|=90;zzl5n5$DeQL6D>65f_T+tT}sWyv=*G`MVh)D z@O0-{m+-AukMOJMM5Z{y-t1cWlTU%9Dde*6rCO}HiqsBHs&{X?vodm3*+RN=b-6TP zHj(pIkCRMYBOUCx&f3@OWCu=2cVC-Rj8hTrGFZ_yq5xA>>I>_CD{XJ&M zF8xmnCtRL}`@%nWWRPtF+CHb(fVOiMh~h6_v^@(hUbvu+CYgh5tovX4nOlYPmOLCl z*Sa+GbB)}dtKzN66EdK$Ri3i5;}d02eKHdb9H6uUdxK-FW|lmim0c*xD-8p`+wqUN z(7y?%8gzjZEGBgASIVvQbPfCPo|cC=KSL>!3>OIt`c{u<2o@rh2f2tnFzLK()Z^@q z{&d12+~W~L9GEwcx~%?b>_ZX_@~hIw%k37KJ`>yASU84SxlY!&Y=8WEEQa)C8uRNRoPt{@)Oixu;3ph}nT{Up zy80?sINfFd8JMI&!s-6(t5`(`s_(ebRe$&fC#XSgZ^VF0%Hq0;B%=5u7r~v11z`>U zXNU6>)p(f3Dd!hVe@-dJH9mXKZFF1dX088{#XH1XK=je`M?zMR;(%_jh(ui`{Lty% zkqM~oacR3oKg8{#2hc6SNCc#tjPErBVatN(<;rv8@%?8P33DmPGb$19-k!ND#4Ez% zx;(?MBat^|76rtAN>ina7w~%27TYsm-9ETcH-gQF;~kWVb6muk+b)LFZ-4`35*qeV z=4R6OYgc779&cy@G6BcBn*3#-(KmZ~gTfgqX9^Bs1|9qGl|IrIS{foOIPQ;?fzKrp z_hCc}3m-TUM*J{X>2~uQ1WlC0bws$Wj2ViqSit(8&aR^a`NN5uUal)}lJZZ?#E}`tp$oF4{57c3BH#$_ zxT&&w=JC_2AXp^%Z|oe8cJX-{T%i+{h8wR`9(>GwOg^DDcyg?Hm-GT7mr?Yslt9{# zCn2v#HgM$2zg4CY%u0%c3@EzazwqYju%GZ7)C1x6Z-y-rO)O;XmLYx^LC@*Il+?6@ zg-sH1OLWCz{>41a&or#W>w^=3b_{4$X=1;HQCsw6s zYH{#RSaBlvpc$G*M` zu{5Gg3Nf+-te`EQ$PqUAJP|q<=8zHq<=xt?-samj{CJCTRR_>}rz%_Ci=n6riKcAm{ARhX~&xu4BAjgz$7&AjyM&jFM( z$mK7WVRjGwwSD;j%IJ|yH%Z)Rtx&?9E!kQWp~qsi0ZqEnXEvs0T@oi`Cb+3*kf1-1 z#iVn9GNUxlU1094^CgB@{E~0P13&V3@+cyG(#s-hHf40&h^WT4fQr>X+(I|JpGEm0 z+mVNSF!5Mm{Q;GG(?A+=Ut*nOw1LB@_rP>>6>jkY^17*C6Op7)-d3_IDg4CfL@Z7% z7gv}AJj&HE8+2uV!je^fql7Q((DstVjWEi6N3PH4LjL{BVv%8y$tw54A3RQY6W@Bg zf1kGHR$(TzynLHkOyW61sz$oHZvFj1g#0nqa>uH^8vX$BOdkpAt!Xj+smbo1Vs2#B z6ZN6V`?gy*$KEIB%qW-CF6hSO?eASKu+P5)DfcFCwcx+qvSG?ySy^dAbA1j0LCm~t zJ9EVvVfN}L)5tr>4L~69#^SR)8uGRju$S}e_eHXn=k1q(FziJtMAH^fo<0&Z4gAil zgRmYzq#nLc;j?p#FFO;vcL6%=wfd^kg)pRJHLlmsMA(f7i+=GXU0 z1LXq)K~?!E;(g1!&F&$L|1Ff&rnJY$_4fFCvXaAw_3rxIJz7W~&kx=%S4PKR0P@fN zesa(gQeYVw0iRzSl@a-nYxjT(VO13{UtmJl=-rAdlvjl$ zs^!+_*nB9Vdu-&*zIOMe?3p!mg!KN0vrx-l>v!C*KJau<)<_Y{U*ez|%J>*k;1q*< zQOpnU8&0*RtR@}j-&$F%a$j3%$tyRwRv@w!C~e>x+k4R|-|vQI7D#}&ByPo$ni~J0 zpt5GjIyZbpW%6k<<73oAqX@-VNeA}S&jD}F^4RG1#?H9kdj7~Ku(COp)lG&&NLoqj zqD#I^c6LF`kf%O@jt-+q!N$9K5VTlcjm`+IN-P^tAe1~DX#5erdfS<#pu}wBhR+0y zjJ(w^Nd&UXef+2%fShxXbX2%f?YqrsFQ4J`voUgKcy~5+_-Ys8+(>SAGNk;vG4w5~ zB}jnHK6SgiBPx0`87XQ+`IaZz(8BFQ8C9Ym%`*?#7RKkA`P0AMyE;|qyaTULvMR6w zi8)^xU-T>x3ZO095fy0I#K_~;U>j&-2HVY~!64~^MN8aNuuN4`bX;*&q(59j4Gz>TFi(5Y(9xj4fcoJnhKbL zFBwlzUUy6QI_ZUD>r~eEMfxMYupA9k(z|2_M zu->XLS;DXtTP45(++tg@ZNm)@~1ez!()g{H$bkte0ViWzU;z{fq|p>-H(u-4Ix_OPHSKmA4{ z`A=bsMPUldTXAcj;-~%;mVEy{rPI*6Szza_Yd_OX){rk(Zw4;%x z5ktE3h1V!7g{oK70;I8-@@LsE2h(3&eho}6zP4!+UOnQ`H*l-O6(>kmA&GJ1TJ zS0WWTpdJ7swHvMEhC7q@OLP8<*#0>=3F|x6(eo(-h?Pxu`S1@@r3BlT$U3Y-YbF5D z(Ya`bNRjl^u4rsbC*bx~KH)HzrVEk@4yw0@&JGMDiGFE_dJ(&GZc6>dkeZ#&vdX3Y z+BaLhu#1cc@pYX?e#^2dJgFw+BNx=HX4}5FkFiMy4rY728iXOOPcDwy-Kd`SeQjcM zHh=qhYe#6Pvi8ui-lIPYGWYS2nekZmbSsXxr&I^lanFPSsK1Wfg` zTO_14t(qoSX!en?35qtwz>GF?Sc*m9GN&Y6@qI^8uX-*ZWW%+UqDX==7f(Y#d86-P zN6UzeDtly>2(5`q7IMXVW!hseJJ=a^!Q<1^Jt2M51Zp=VqO9UZR<7;4ED6u1Z{{Sz zn&Tl#7RL*R?w}B3WzC^9SDq}q|EBy{V298CdIIJ=Mwq-(`K2F104O=stjZg{Eve)D z`vZ0{Ws|?9EPPrlB z3m-X$6bUU*Sel1cuV@gIl^-|wetV)0F?yh1Ltdd;89)4c@r=0duDtYZpJ$d_z(&E* zUHh%eQ(~^-seL!|0-;~(bu=ec>%G1hf1@W{BjITHMoFMVKWXO_6I}|(o z_QN}#51=(`1rLe7O-%w$PZF^Kw<6DGLtu69Jc~)`w15C?sX_1V=mN~wOLT`dCO6vq z-okPEuaxWXoef{KgnpsA{xX`FxaI#0>HT6-%pX?EDXS=>CCjFF@RSchZ#}*hq z^Z&+hyeN79CZPNFBBDS@zwS(Fy|xV?P^@aYCiW6~W@SK#`spysO`zyY7ogiM#OCgI zATKSt%$gdqltvF+SBY0>k7U>guTD`3z1IGirIcTw5!TZe5G(O8ek_9Z$s!=|E}kVV zXD?TCChG#${d+N>9pkG1gOAREQL)LlU8nblhP&;7kjcmtw6?YCE{3&a{lauJ3qmf` zQ=Ka}Uu~>kFN$i^u%P@on3OMN58uj6nQ$45NOqA`D%s0gXvhIJ26Z)n@v7I)Olm!y z&H?c`S)d~JxUcvUR|}TPZ4#pEkr%H zrlSFuoEfItX{Ojni@m0RqR1a~h$#5+Ji61AY-hBUfw(PP5AVC(iGFoLGeKJAB5801 z>~K|9_1W$HWPl6W4AQBQ*#*)9<-#OkK926)=(AtkI_}|DdMr*<qpqcrO*s#uoIii7k(gN)|GH1FNx+Lhk$!|ucJ)Gg+%m@+sq)Dd|w z!NRzXsXK%#a-E?3T^=tNr4xhFeEILrtZiBl^ko&DreKSBnFBOw2DT_q`mP0kuzWmj zXlBDb&7$2qB`M1l9m#|J)pn4ktJQhe95>-Y7EtYa$bc#iJY-*y+hV{)xeAjuy!?^4 zC>NzCmSd=NTR9L zESarh9N-8mVgDoGRAtZpIDkPUsy^~tM4FoBM@dBk7R2UzPSpVEpF{Ci1u(_L!`#w% zh58XOIB#{DoIy?7B#&U$W}NY5}zIjt=8Zex^U&U5)1%0fC$Hk#l)J2iGz1M_hZb5v~y>-f;z` z28Io|7#{~|LFjBP5aMB350n6s3SOdnp6l3$AA6)>Mm!{(#-sBp?Xvbh1eCL z#F3){QJylh{9eV?{sI=%S*##2&RO#NCN+<`%M2N~2p;1%hi8?o7;xJIt`o_;Ny`d#oymSem zdcL8%OrXkfelw_Ely-UWT1W3-o*$P)K;V{!YWP4HA@*~Yg7Gh*AX)sR7MY#MWHcr4 zd?*sOC;fBxxRDr!QQ?Hnv;muwm9;;Jg^y&u!E8H(N`CtP$bCM5cTCLMN)I@8!L6g> zE1vCe^+|PeoyV`|bF4IVOli;kV!veum9k#h7ZaZK!yX>Ws5F+77G0?`gk4_yHwqH0 zUM#oV)hlcV!!YLsl?4s>Qd8gRSt6==ca`hbg7K!`iLviX5{>lBC7=4ek7VwLz4u&y z6a1oRjJ^{tt{!g4URDWDD3T+NiqGud!82g*)M5p#^ZkD*tAW$ z|NOPp2xxgkaaX)TV5&N2lMawqueT`iZA~cJ=y6jlLvl`@3NX`F9O9>OwZGDWGLAzL*}jXICcbrWHoE=$9GKIqY8QV z?Jv-KD;<<|vYLGI;J5MO({howX|*;XfW52E~Eh>z-!UD(}Yvj7yCs3 zOglqZz+AJL;Ix<5(JhQ@90lkVw>R%7?_gbJkqUW^A&FXiWY)BJc8>Agadix3mp6ri*flBL_>s)!ueXO565kHZ+rUTS{p@@{ z8Alp&ILUb5()M~s)&k6yU+$xIi^9q=BfeTbBWxqvzMLV!jt|O6%qr;(Pg7$9TCIP{ z;#-BUx3kHn$)D_!f_F2z0M^(~rUJ({DVT$v!?h&vT^NHeKg4Yv!nr#LUPq)~FM2;e zXkKip(C$o&QI-P)CdgVGiz_P2;H)Zsy;KM}Viz8Y42u#~#KLhu;nxE?>jf3Z-lnJd zj6LB^#7xy}W(GaZwk4QNK|SCnMSUw}c$4H>7!=X829z_%=mF;XGyuKJYw%1Fby|&L zkT_G7t0PW1Q+vp|2|uZ$UHyiHw0mRRoFRxzdIX8eAKenba7a#9a#nulYSVIyAR@QH zlXK3xYpMeH9sd=e=U$mOgkRZjm9Zx!Ennw=UCj7QVX37LZ7GkMkNOOMF!;l5{AM^d zmA7|*fRF6HtwMIL4dgXM9oA{2gvn!;UuAKrgc!2L2V&%X3Xt;{dm z_LxYPSG@ccOOq2dp|bqhnp;xVb?gNbEyAZe&6HhmHAx1>;5c=s=8U9vTl38e(^{q$ z+DL!gh7;PfOie$j_^ZbiC16YBg$y-<#@1G|#P5AxW(ZEF$d~o7Tadz%iD}g7EJuo) z43k%s7^jgFeG3g8m#R%@$I2{C3^*U6a_P3E&`gZs1z_|^a6jy0ymE+1O~z>I;7Vk0 zcB|rc2kgGqGr=s79jWuI)_XG1?|sd~BpyVNFZj05<=)`Pj8XLwE1-*v$`%J}j(?6? zdp#zC+cmx_ZsXO?oiyw+gp*rZX@n2GYn-nNcy?@hT{!Ri_lC!N9?D<#Kk3;|HZX{@ znLaAvoV+LaFj-PDOx#IX!}meGSXi>lV}^2dRdF)Qw^gGMuq7rFcyia~#f$FU4zTS< z4K(1^iuk<|K4_>h2N2H)8=`3W#1}%bLXpeM+ckA%_DXy_tIJb_8343R;ZJZumWMU( zSrD^^uij_BoPDQ|R7kD`41X^2*8SQ|qJ2nYazs&lV`d-taE;hH%RJK79YgMY?KlfOoY&M%du4a(`d* zkun8Cxp3O1Cfq+WUwDBwmqf7R#SwHRhte%J7&jmX+6}Z$g1xLBlwE$I( zJ_gJPA7s&JWtXp~aqG|qq&a_*pbgLm9XYYBENX3ke@}2HZfZS4)&umr;Pvs9>&a9) z)Fmb|pd`+2TBD(kr~W&DwbM(ek$xL42n7GuwGXg&*Zu>Z*u&5Tgo zq;k#>ec)hQ$bXLTQ_pCbX87r%fjy!BiaiLW8g?D+kN&#nPP34kf5{I~V#@Lc;tAS- zB+GaSePEZ2q@-u%1~%UDmliW3tb9yuUbO%%U}2ox6@pNtMnth%u6C-5Irs|LToaay z(}A>{Bin!itbsdl%pr+>Wu&h;I`EPDBZk-=s0cMTh59uD5T0I0){>R~JNixn98W7D zL|ikaEW8PXls7VJcV2ocs$04Ea6fhbf7*!zcyJE6)Sasb!a{| zsB>dcm-5cGQoULOX+a(ROkaT~lZ}utoQ* zSGupkGGM88S{7+dZv)}Yl7!hO!oBM%@W5gU!mKtOZh!VBcG)c#8|B57iRQd)!AZ99 zwFa9qL*_rF2VU2#jLmHT`sntQ7dDVYNe)gMFFdeCc#+0p>2i1vB7&)K6G#EsIFW~| zp-_>=Z8E#Hx~{RPRz!amqC+8@FYu_a zLY@VfclT>FMVPjmcE@&4)2Os}sB)}mNr}-_%?@cH#nAGGcOJ$S-U08L?O>K{(X@Tg zap2Sd$_O;<9DhTk@4QNMk%}w)T5tn!-2MHUmecb1_!w+lUULa@oG4^6Tf9Jyl;E`N zjHF6rikEr1YVGR^?RlT7G{II7OU59AXZ}S8SeiF&f26sOIfw^ez4fihTXv{%tH5B$ z*Bw-N&dIl%Lp;s;m0Y!-6k2QO|4bdikFG(q`KUsEnuVKILo7vrufs1vbCU{&aZ2xb zAyIp!_m^R1jse>BrXye@=f;~m)LEDW2Ei%!@K`o!`_I3l*b!H_zBZOF)*ZD*eg9#* z$BBsp@34EsKD*X64al{g!h6fkjD6jy262CAD7nWn)oWWSuC8FaG2Q!(-ZLeNi(@m@ z8n|E{#Vz+*qPKsrw?nJLdV+F_Zf}2)t)10nIk$tmggq`2H?9x4g0>*OC+?>huE1e3 z*T7;3I+JvAEczXdCgND6J-n%U`jVAWo|~(a{4+TS^99tn^#QJ-J}!Q&lWuOkUMM~n z&8V`TsyD)@;vMZX^f(>u#R_bs*#jbU^~C~!4Bli0C~sS~h_BLi^)rX~a@@uHb2m@a z+>3f!yQPKXE9=wRzSK4ih|G1cpRkti|G8PvhBAdzl}F*f;f;iWwy0aqE-b@EdN$YWf`i*$X8A^6I2#{?_@K z0z)vceulqsUNvlDH3kd3rC{sk8@Wl7y?zVX2FShEGcr<%;nj+_iQb&7&R#EV=w(67 zc+Y=u|H)*i$AFlb4$=7oiBD6j1I)bHpZUJyyC(ke`Hyz(8;#$+VRAPWQPAT_JXd#0 zu6!|Bs%QK*li)479An@B>z7V7h&tYct>9remo;BE3*2e~iA5zGg>OUJqPjka**(wl zz88S+;wPJLJE=kz6nQf=5hGv}krNAzKCjy37#@$4#Bw=y{T zV>3-3gc>$T+3D`z-lC2c(|I=E(;+5Y8MtKB(I=yevRpkY3lSLdLBcc0_|7saHo%+b zNkC8au*oqP`KlY4L+Mt$-8b<3PWm z^UHL=?-XZ9;tUMTXT9JgWCbai!qVkLK>Oh!2M~rocVOWOj30Z+)7?4*v-C9oy?KR6 zD=Gx!&P3Imb5oy5W|;~V&?dk8HEMU<5Eum(%qncHv~z*qWTnsQo&q=Y_0#DP zK3z&lG8$&I z#rH*gMVAcO`nt}l8biTh?(>rpPPB5K%U|rd%J6ZRqDwXQ(3Yn!c!nm$9mo-zXru)S zYW(EMqif2Mv8aHWev?H>f8`UB`~*F=ia+BL=pU!#mJZTv=Mofd|UkC)1WIH zoR+Ud*O(ETJ{xSS9qo9|vpL5QkuT3WZ>d^*J>JT2r|zdLXJ}pM&`46ekk|960^BCL znF93JVwC}JM0KN&dd|kRj`T0u%!Pu0Tao^hrly^`KM1if zP@yvVv7?bJp8w(;_hctnW$)i)*vxhbTsL)fa*}hu#n&e&41{b=c)V`*I9`NahV+NM zzr?%Ko)(B%R_rh^44^!liSa+gW0%T^msA>}&OED%upAz@s9Q9j2v>e5IG+!e*lrVS zqAKZklc;fRF|f>?rqVMCC2NIzOYMlmF*KLMJ!F&Q?^?OIHJ#B`UW-^v0}HN2X0?}t zih{asXa-jgj2ETDt-6}np7bg;6auWfAH#T}Bzm;^2-pPoxzO6x5aHnE_E9!_=WXkA zyB4I-m%YSPWqqcH*Heb#m@Cm^X6&ASqoIapVUYeiatgDwtsSDh0Od z&M9tp&qiy|2^de;@&3`^Ii6TlXXhU^JloRfbWd^ft`8(}32KfaD8TB37o8d=3$prv zr>^hmJ{A1U`3AG&6df0uL#dX$&+RrjapZ)o{Z($M-v#LS%c)4JIhc7zpM zM;@Lt^UR_Ab!4Np-DTNEOUrNTJ{yaNKmL5hQzyTdZZxMAVcgDBT#$SD=XFl2Nd1l< z>>T$&W7I2ah>`E?lhu^CP)D%P{T{MxXQET@5@=I+7TCM+p3l2!cATsBSoPdVuo6Us z`p}Bld{Ct9 zo?kI*X7@a5oBK#y=AZ%l(}%482i{@IYjwzwYsX1Fw?20NbLH^)L$ef0?GKB7Msq7d z>my?nE!vzf&#I4Z5}*JBo^P4b(ld!Cko&8hk?Y%9xu;U|Q%HgzH$kHriILyeYiT>0 zo=Q)|p>CBiY-Vya{%G5rSsc~H1PXPuW{>4Td}ocr-0}Wxgd>!k@=rR30HsT79j@-N zZe$|sa+E9iKygrEMebX$`TYd!ynF>aEp@=-!gaeG{JslUdSO@z_JoL>PDJrOPe{?){&hr_v_Dt4)*HZq?PWOW{D`1rM7GjV9 z2wV}h0PkizBx-OQwsj9Dx^m! z+G4^<96~nIo|{6TeDsjaQsg^OGFgM+^SP@9lpC!{z4$3D@!LFZ4BxO`cMhTeb}4Ks z8h;6+i_!^8wb=XsxfM+Q)H^B`?s2YO!fS~IVzet|Rfgf_z!`yKb+O<&0eTfIqc$}Q0}8EK*xMI z2bQa!zMH)%z@1LyENA!Kt<3BfD`0!vX5#wV!{n(w`r9m!J>WYqstpVLrXU6WVY%ae zDYvwX2yuX|kFPdA);NA8pgT(~w~(*4b!0sERIW0@GD3~$NqpciTFeZ9ayt3bn|H*! zcc+a8Rqhl1^{dpx9yvb2SImnxxpd@hQ{0f2jf#%1GYL zey-Q{hkxn{v~UdUiVU2xsu-E$b5BjIo=8p~neE&! zUv)NKsoGocnFv2WP~r4Chvzxd8>>HZH%c<}cF$Yecf55A0*^5HZK-yxh*8w7)^*W{ z<+o$3?IGhP+uwKjG0gG7b4NVuF4;c(l5Y-~C*}7C8=4mhSaNn(G-(#D`@GZtHY1@+ zb_;45czmvLHtYkNmcy2Rxe{kDS0oich5*rU!B@vyD)zicMCG4uMK2#418)=&Px&PM zr|-Yhc$7UgA#yK37=F;9kW{Zdx>=l~kZpzeGBD#)~@%f?${N z?L#jdZuARFKFWc)aHyv{V>IA?HFAW#W6!x`o^1#CU4pNlA#U5t;;1H5N1S$taPCkH zv3YOVJP+)aS;&e8bl1P;@!xhWOe9LB9;m}HZaZR?_;1VBZ};&QC#DBz;wJ1Fn2_B{ZF205Q7v(TgqXyKr2gFDP{SUX?v`-2K`#SSPmGVQK7HDI7D z5_vLMA^@bA(*Q+}oB@ei#}G%at%;OTRCOHcdB~tC@olaAlGM27&?nKAC1S|UVmnde zF5j(9Egn({`ot_l-^>pGv4bDmx;C$c&VX&L-G}>Cfl{ZFj-j*EeyEmmc=HPN)aM(2 z=x!r>t8#^FW)zUqa_{9&dRzk54GQ!MBT8xm6z0{_iHd0vU`jkh>k|$3c+@;pyPaO1 z##Y?|z5NH`P|Km`zZg{jk#$gyC*iqa1d4L*S{nM}-$@%mCsK9hUeJQo<-|scJK__3 zJ^s+ZD>sZxbikw569UltVxmZSl7R$6-@P&TUJo1>QYe>O$QbBE^;uCsAcZpOhF6ld z(liqio4hguJBdIYF|{8VqEEDykca63it#L|h{NCx{>)M=PMD+wzPmh5M~j9$*bC>* zm{Va0I~LGyCtdn^+9*4VQ2CQKi&Yk_-x{>f)y`-QUBf5gL_ z%V|EEr&F*N0VbL^G}2Wa3=)KcWdAJ>nsS#=8F>W%F{DHE+@i8vRKL=#$oe$I=Isk3 z*Hl0xuCRHf4GmXKm-FH$_>x}Y=I>cyf7Yz8baO~{EpuUzVS!$ls1+9F`O`?eD`%do zQ_yU0<+DgerS+~Ofk}yi8G(_onNwkmK&dIy-Qd=Ujc zglpGA!p^YY*g^h*c#i1ncK}7Zg3*$u4CP{7-Ig|ax`Ccy{?GGy)VcjzLId5%u$g>||Xe#vWQ z@p4y}SfKOE6@xJ`d{>;qPWK-8%`bsH4DidToBSL93A#q!bnh+&(8;mNe5enT+!xH& zF?(0|k!l=k3~k}`-&UMN!eJazuJ_{=BH1N{fR@s_rO9Yc%k8s8LV)_alq>3&A$8=4 z++3YN1Ioo`Il3qB?P9y9e2U!-=|xVz4*03!^nbT|Le(^-p>+bZ9G73dEpbuQgC+I% zugpLX`j+p>2bspVYlm9FVqV^gRlUou-r7X*fz!V-*X5K$59;mm&TkKf*JkI3mx7Lm z^&n3}bigy|wVkN#%w+Z4shXA5l7fPw0{hhh8TiDr+}p?OCA|nB0**=wMz7kTw0kQr=zljmopKerl`Tcd)oR z%Tdtrrt_lsk&dk}G_1^Y$*h{?-tu_Eg|L9!+nB_b!IT<14|3JWu*=^}}=FWTv-QSSRUsn8$ zoUxD%SXV5dsl2|G;Ek}Vy9Oj)IOGq+iS>5pTt;bXsbw6o4Xuj*XK7jg_tH912&YDp zbqr+?o4)9xSGWOYy;4lZ>eCkM1ugc9!y)5RIDXh}xa~l$k;5kEa}HHj7m_TMGH#%>Gv-TZN%kik z4|0SrIpIh|P6B_9L*-Z2#?4kx7jaydNK1#g*OO41^*mrwXT1NIw&hX=czCpHygdW< z0bl+>cq0~d^K5d{z1Hq%_xGQ3d#@5UW*`ERSs#Egoc^l%oY^jtS5p2|$v*ZN_}xWg3%jkSU+ zr9kl$tJ#lYlFQ^XqE#W4==TpbQ1_y=QdD}5PC`Q^^IHd|R{yt7F6&fqSK6BT{}$X; z05=5sQkcDBBRhC>_3)g-m2UJUT~eB+;a+r?(OEW z6I9mF{1ID1(kdzVYPa1pfJ~Bn`lp8dY+}=%okQpCdbenfs7_>nWw%1Av%VRe?h<=t zLT_H&U{3Exu?&~YlZz(6g!($cSc!tsC z?Qb;=3B_$D@bm$fcEl1CzwnP{@z`MJx?SGI3z)8&J_M81RPcl_lO-0S5agdU@sB z2E(Pw*Z0>pA1_m*cjHtcMs0c;fYGBTpz^EIL>6oaa0Xx>cm4joa3|y^nd3@-<`syM z1`0ZX^kPuc`22ukA}N*u2phLxThfS@T75$ne{~9YmUL6~26gj)PVDy=5doo>?l_XC z`pmJdjm|$`n`}yOWQe%5Xlej1*@u6ZjLzk}qSIAr-TY>2yYY-P2%k=R4)8nMd2iLb z^H%bB)y+_kU%7H_5(CA|OO2qEa$xs+jC(VdH8sWBBREYnk?C%21^FFM|BU8x&kF@F zf81T0TR3E`3DxYAQ=l4h$)3vV$ z`Sz#l6k_)Zb=zbtUlz?lRxG`@r~mJ&jOVP178Dmhl5IKIn79U3i$GtNP*zL8(tF6- z1}K(3{mEd=TmisoSus2SlskeZOYeR_?#YUHhk`9Yo$rsl5dm4JcN#E&QG#707UP(w zPwnQHrXKKWrezLSZ77(lnJ}l`^^k~$`E+43tUh)bR$1YNkw{7x7k;x zJNgEaZ=Zn+6xM$P^|W-Mb&N;Z%G#nx5F zRkd~7eGbh*K%}HmP^3WtX%Ho)yAL8DARy9RN~naiASE3NBGPd%XlbNFy1NhY*7173 zd%ySIpZXKFd+oL6nsdxC#-w)?N>NqJ!pD0@jrx@K^TMKxk4R;|;FT7vjti*TFZ^}; z^m4uZ($-qH%mmiBB@_>c*EBMWzTzO`x>PNyyIG^`Z$P$*fH{!NZzuBJxF&wRWd zbqF;Qbjk)MXZ{_eYC@MMJ_)4=qlqjQCSC~Ytp&NiwkgQu zO)w<6C@TNw0xMD}K;01^u|-cg@y0WfK_Mk+P!e;gl|Xrb8=UoZrdeHaIACbI&Hzq4H2}+8!ahGU zyLOGb-@2Q9G2=D}FS;@}Y?uO%}vi_8%VVV;mE9 zKd>kx>_jNkFyQ^e$wV|FFV5ua=9c$oDIjcyJ*Y3xPox0^?H7!kkDWHwCQoSlW_YZoeKGN zKf3o_!m^^W2aXZN1!t7E>|b06oYW1RnvC-s!a)_JroFte%Tw#bXww@cQ1!~dfh#j- zXuaq84*4?y>;Y{5@DyCAoShW=e6c4J^c{dbG=3lnw_4>puU`Qp z7t2YBEL75jRWqAa@C&d&s5St5?XPyQ|7CHxZ{49EH3M&@dl|MmjFgk?T^30V4o_v1 zHOv*9GvV7)04f>wq9d(ppH2l&5z$Cb50rx5j=W;3=XH!0!s=ytpZKNgng`eBEZDJ- zYM&xLJu)8Q7BTh=?ChFQ@|t#fbXUpATklZKz~D)A>Ki|HdDX5_<(D|iLH(8oA~wsl^cva?+Ls_fi;-7SL?!g1uJS}B z(a~f{A};I~=x#^7d-ra!jiZ=&38v!%{S4B$WQjASEA2{2G5fI9RmYR?dspJMRHQ!$ zfB1pt%VcJ7T!Z>bg= z7KTWGCsEM4YvrkWrqCv}Ojq1{1Wnz3)wa1$Q*rgJ+5c7kSoc})6=;`YKRs9>*+U*&P1{y85w*Fhpzoz)038 zPzsP?5p5!*H;e15-{I-~NC1fScTIJba)_7HCpP`yBn)|o?@0pbM5RdU=eL%EpTR&K zpc=5D)_`0uy70wI5pq5id*8NWjBLI>$t78wTL9^mxWyN8HJlV2>uRTX*RG`*LN?m; z9B6w;$J!XT-zN*U!{hO%BRFSJ{^0%cl{SY?ZT1RGWqUta#a5^IB5*?E#cotpRi)Y} zZVbZfi((G)37Q(D_7B6;s|9(hl|BjYB~nJ%<|QD#p#xWhVs1w)%dp?vX{3e1cTv;4 z-~Y>k4b1-%V289qlMJ!08Pc0FSl6(g0?51Oq{q`zdpEXv2(N|-t{z<97!pi(BWaUYA)R_I zB&m49a~3NkWtl|?z&Sbh=a(VDAQO-COGo#P?Ed=`=dFu-^}YGjrKVzkF+0cNrCee~ zM@vsnbV7=uyj7~ZY{XVP0UQ~zpz)kFn0WEy5sV4IU#Wruu!*gnoM&{T#C@iEt8;PndEU$R_aB=N`wOd`|JSx{{WNVo&=!Yr{}};w zJ7>UMB8>Ii3#y^bUtgDwS3V%NAp{8tiMzkC%YZh(U<5bCnG$_gt};#bxh36tl~CXS*PFZ}nb6)Et2oW{XTx$Pl~O!%Rs(EjdHZYS>cb=5Zv&P8#wYH=HA zyf+En0aDi{5ryz}$ZdUV4+3o{(aIuI!wi(V#c5%I%8i+2NpgQf=8;eBBCuh0>_!rG zs@ST&0XeEDO=E+9LvP`bo(BK>r{5tNQtxjN)?pxqZD?QlOSE2z$(9V85#kijr}Gah zA<~f2qnXRf4LwK*Faw2WOTxr?;>5IHp6PieruGMz28Oec5llqOY+^F*IdFF`DFWG`> z&W<6d=2tMS&1dXVzm3$`Bx;^iQ!=a$7_#cJziB?aVd~;F&;n8P ze%Dp`%M~E0{ccc}^~%KiNVzB4g2SgBL)F(bCj9rCV?f7eEC%{I*BFrKgN+2HL*RKt z)m0pTg+~b0%qIaJFgSRhm=48na5?IrRuCUiM352{6g+hR17c)(0>_(hC8o)fJAZ{9 zp9DCsw*3Enia4lKKzRtN8MzP=#+-NWuF!~kmO;G!B`Xe<834shf|tO2JT)v8uTU&3 zsF~RdQrvE5LOkXFj&64kcvB&Tfqc|Xc8crd9L|@EcjNzBZO?xsTmQg0*eFZL|2@$Q zn2v_V9d&he7!(W!UxVI+Gy_sCJaFn@>4x+s!l{(*aLzsOBh;WVJ%b%OXPKj+!wwA* ziR>RDc2APi3jYdJ&~Mm`+xkzy0U1zzo-D-K1eKsSFkM;#U`P>g_oNtL{XHdSUl&Jg zgC^lixX1yJK{TkU5(GNH5}zY+I61xUzesLOo0H-cmWYt>nYjQQuih^1bp5G<9CH`)U3(373LhZH{?0axj5;iEU*Zjc0JoH+2;&w^odU8PE`Gx;)xC)SF|#3)@2)21Lb7%FFer0IU7>dM1+u);~cn|j8S2U0e_S{{OUwaqad+7Dl zdbz>Kxpxk-P%Lm9X_Y>`)!CY6t~$x68w`nF z{O}FEbeQ#;ytCN@Y>&d%TGVcm^c=#9Rxf_%k?Oi$-W9^moaVw@%HmRy7PCE-zU@no zT1`Bk>@wL{qSd~i7(H(MT6j?EofJRu{fP6tJ_Lv=VM;k_lM-Av9zVIo+E4B8lKt!8 zVNYn|TyvRDE z#E0UoYf)n#QKkHB!psrdbde<;{Va;9*-A{mkDHDBKZkmRowJtf^U7FiQt7YJ>I6y1 zcEW|_0&V|G1MlZhdX5I9^Pyx@J}KELaQ*T~syJpM#@wO1d-M;CF-mS`qFKi}* zJY6F)w1u0kS2pbfW(><#Wyh~pYi|591O&n|$;T&Ockj-7zgQzvIQ6pV8NY{T?bP6^ zQV&C3?_1D(TH*V+a-r{Mw7K&FlPCjJawj>x$X-S_^7n9SCk}h1*YUQWV{c)6k|G$KxFq9Vkp59y4kFE6Z zG(q}Pgqs+jEgs6VXL0SutvuZ$KIQAp8Y9&i(vw?ie;tV-z*>1oz#@j)q-+Tcgk$uf z7pQrq#84;DP^9l}CJjy_V>d0hr?TFiJcc2U^xwoLSol-LCcg%k&QPa{QV;c?B8c}t zCtKIJg#^^l8?ruf5!u}DgW7)z-GC53ySGFa$BL|pOK9W~I}trxr>`18b)BqOO43&_ zF;|i~xQJfz9@E;&`62-gX>K|8j}1G}R3&vTkSlTWxHDPgyv?$^+7_VOXL+%|TK^@g zUVA5i)*GT8kyJ@W$0f-5F{aV1&4O;YOJ$fSj=zxEvb4zMn{C5*kf^LJI(^Kmrv0{zOsG0J6h2Q5H zN6Ie`jAnMuDG{wGQsJTuG}E%*kS9+JQ~BrH6oXbsYnXzTj%B>m`gl#kDw+H@Xl1fN zGJ*b%uCa^D=fJ7+LBG=ko|8b_{iW}dqb%&5?HPeZL@*O~bY?gKE)Q>j8GyPP=YX0# zQ`N*Te9=ns>hY$`AMD)-lX(N|-S+W7TrEVDddm(Sktzv;54vz{M%{N2%AmI7V0amsW2xnl);j_4(R0jbEXT z{oh+R_#PutQoa0%b0%dgl#^BOVc}{RrmcKo1Q4oBS=(GdztgVInD5(}3`=Ne4XZt2 ztQu_&8>*I2&PV5YE%hX-_fKM>3|w2&M?W3(To$dby1umA?>K)L1wF?4f%4Wi_g#L; z-H%nIkSy3ASd73yx)g$CBOp*Hvzcp4XN|%zLFws#%;6&NKS^)$G@NV`LaPOZ9}42} z5^<2MM^$hX)UeHelTGMmc$|vx<@{$tcdm$w3%|xF@KsGUFcKgqm?mw2X2%Y^iO z72WU2?^}5Ez3nr3Pkjs^o+@fPVE`UA9O&n}>wC2H_tsK|R6upDi|I!EKX}$c?dAW2 zXT{dS>Fg#QS(NExW$#_m>06)9bl&LZrf4&M3{g_PR){3$&MEsy62BmHS-}FQdGU2v zjP(<_o8^^5bpqJG0k48W)~JD=??&+af;tQ)|3fi-pin0aj~b!|DG4O#efUKG3?Fhm z-5b7^7gc$-4xdi@U8atw9FimA#s04Q=cT`bmo8R2JtoP?@3ZXP zeY16o(?*NQ2V2$I`wpSY(oZERJp);lZby&-?Sll;C4&$u(q^RLwdB7*%lA6?&eiKZ zp#Q(!Ix^e$ zeOqx*Ko3b@)#aF=HfaHU_+>~-0EYZ!d_#yHwza|0<&bj6aA90|*zSI^-W_4SeYFda z-oTFLo8>;TmTPt+8cxkSUF;7@Pf7#G5Z%T)+M>S^nK&tq_O@?WfGQVBCwxVE^CC34 zTn)++sD#$OG6N13>JXJk)Uk;R2fWyBn}ott@w+)V1cakfV^SXkPW=rPGye!uScg;bm;m<3AeIt9xK@knqHlmhSQ_zQi%byeE z;47m!x+=cga}<6{-M@Rm$^#*K{o6Z;%1x#bso%H~fN%C4e&6G^nIKsjJX(S+-e z_=z4H#Zo6MU^h`f-b+O zZ@mg^@$+IwR}e!{Ys`(U#@7Bzqv9jDu%ePs-&?+364?_XSEf#_A{?ZRm2Td!KBZos zD8BmnC5__DMr&rG`wkg=;5p(+p~xM57?R@x^oara{P}Y-h*60tgqVJL1qKrJ2|&^X z^&%Ozq>v%GJA$RQvGgVz$eAUTiAvt?YW9;&N8a*!L)S2@>FI&Y<^f!-0C0diBAhZ$mevX}as|zL!>G zmud_M0cpB7`?$mci+Dpi>2{OC_8s=3@Wqe zkhj^`{Rp7%B0CzpG&ladhBYtB-f>~{QdlomnUxMrw(5Mn&Lw|^H|+BZE9CW`g34z# zkJkg4ve#Z@GpL+r8?8*-TK+(%s3)9g;ML`q%-!#20{=0Rq;!KMr}x`fegB9{(Q@IX zcqs#t65|?I1)>sAX@N+9j|;hu?+HCKf`?T|=~xl4K-3R_6Z(DluZ4$gy>jk;05=!V zd=LP`baM6JN3FKS?Ei(9m0c#-?d5P#PiuiuY(KF2)>m>d^IopI^Pw8xHgkkS!aG9|&#c50(~tG1Bf$zf66$=KRxPE?Aq=3w zLI0Xk)Q6H@Y?tlxLRc5iTV_!mWp!*iH0$DVlemCWV*`Sir zQi^F>5q`p3Az1z51kDC2tN)kVEgS(m1w z0>*6`jc|QJRNLpr-wg)t#ZJC0)cPFf?jIM|GwwFY1rhO~<~!bi&JZZ|fu%=r)qD~J zfveJQHW+UC# zEW1*bFI`uOwTObu290(3@aw^cn_)Wa1T2;pQx~o|Hbk>BB)a?mP9?!@)u;gAUb6U` zou-xjLR~fkMa_#DwWeC#^RWv-ZTeF)!Tiyw#_J#F;ySJD%6^A=EDGKOP{_ktw%!hTr0U!=N@Ad z73Rl#Jd4ygW_t!EG6j4}7=n&XXf!pFLr0$Uq|WQ$1)iR@b^f>Wz*(-SL1Q^!M5a%Q zDSwlipmuo})E;LMDL9d^b-^8%B&$C*dc zZQ=MAmR)hTk!TVIOoUdv48~|}a#)?j6S~08ind_-KQFaju;h0$$fF>#V_(&!^7k0Q zmtsUD-`P`MF1Dmktyj2AQWX`kKwx(BBLr=;fPdxgshwZU5E z@tDr;0I7hhrP%u?(9j3t8f*+%LFt4CfHkBi7|cn7q{IeRQZIx6nBNHmwf}fv(RO`G z*F>j!3sO?e{&u?-XIuO4ollC{`OD*O5P(_x7C&BsTi=`^yCK2+e8i zB)D^{{p9#oS=xT^xQM&u3r+F@E}!dBI*!b`&m_~K1k^Da>@MmNIECK(aUr3g;48_M z;ai3qRViNZ)3}q>?d))h6%IV)L^-oi3(zIy_+WK%I`4E^`29K9nCvtbhHMAM zWY7>mw)4}|{g3z8Xg2{?H)6}~?q4+tC%C^SRg&U> z)U&@frJIBOtxHik2gq5F%dme^-eUEEJ*d#3V7>H9n--Nzp4PzY!6=)K-?cK$yQYq} z6r0d!l~XRj&u3@V9zJBbKyxb;(}X!*;fRFk(36w|_&DSM99Pb09tX>xrM^{`Ev)MNoAKn-O#yo~6ab z-2>b#o&(Hl{soC*`%4QLz=szs6;)Nzqig8`Oe}}ZMJPh~Z?H0}Oi}fI($r+rH~+(h zNC$h-R?B4)e&o_#^Q=U0s(^c0E#KzfF$T;9Ioh7vMPZS2gZgW!J3~gx$cU2pDZA)~gm$rAWQq{r6S|RUvArA#GjbHCikTZH*iX zt_6F%{~`O07K$(`YJXkO9D8U^Fv}TWDla4D{S6!3cfNyEI&K#uXnLkj11rVp^I7EWsO+Oug6eF?+)mg z{j$q9UfA!yReR&}dN#Cr=eI54fL2VdN+tz|PB*wql|@}w)3NY~)zsBre>)Ru!*<7bWh(}4{jYe_44g)VE=9?Ur=Qq3#GgmA;QOvY zLs`GRX8({Ae7yO?@6oAet7_uy9-;H+K4_K(r@PM_e6>Zoc0y<5b~iSXi*0I;Pfk3l z1k)SqywLGm%Q4qe@u7J$A2jY9S9@2&?rdvJP_IMfzJbE|k)|q6c8x`(aFP-^m(Lv*d?e;9%)7-JJnM;0DCIb=KA{xK;nu=^MI`shJ=+Ek)t` z+l1uT?9yAd2$cOBNz;-0VPRW8BI(5qwv)H1&o)jEIA)7e#0|ImY?d0c0Uv}>;;hm? z`OCMvlP66qLQs%|`zqh$Q+uwK4x(6xBIvQBO2n(vIGGUd9iDgzQ8$(OX|&M9;{SOQ z9>@v!3<-Z;y!9$Lg6^(e(jy{X$=}(4zyK%~$~^aMU`SE7^{i9$fhGn$^liM<(F9>Z zJKO_Rk9xP!z zVN$FA2rpU8kjYlHV)SegI)AW4C5HEiY5~P#stt@(4IPfosA0cEHwT3#HU}Cey}Aw( ztGgv9eUr~NdzI=v3cCL}s0eLPk^rurytrI=1~(Ul|IzO_QILO4H3icQCC1oi$Pn=Y zk0Wf_+fULV-eNpztr%(~7J9;n7`6R0kLkLmzpi@f)=68t{3VAHjFFpysv}T98oY<7 znFc@WnsTYFlkn72$66%_x!Mh?NC`_sP}`c;o;;NgdM^SIHTxd5 zaqK1xnjZW(=u0#4i92hOO*1uNJ4KJXEk!>5))=}we;R`JcRV@$A;d9zlwaT&0%)ex zo%F}(w3m;DjtR`a4Do{BVlup)c&Xt;trRNK94&XAt7uT3tos$LxNyFi;-+|Hzc$)# z<%5U3?Qq-A9}oO^T-zeCZPGRfzXkw8orC3yB~AxhQP7=JP*X`*lCFP^dz$c~op zXqyo{j3MsNHf6L~bN2?GSHB@OZDkycENi_&ijtBN5Xlb`up8ZA7_Pa`hSy}_K3R)2 zgtW#5YAhD92B>j!zBzD}NKxrU?iZs=*pkWZ+1HwAq5ZxzGFWB5nmI0UtSh6}W@EZ@ z&D+NdIm){i)(_aE*mcjEtvcm>M=7}ido!r^*R%6lS|Fyw3AcKg?+OaLxw<9<>~3eT zwCd<8>1??6)S(O$i zc}K+OYVO|cR+c;>IGsN6ND}ZBGj{n-@svm+=9+2_kE!pQv;E_hTas6Ud^g886d7vK zxVx(gJf9jD-jfupSJuI68^x-{*GouF5ltToSDhYXN6tD0I6Xj%+U-6%z7daK4fyT* z?+p~j&mpz#*^Gu3QIGRe=_P6zf`!wAg9gS$^W^y-OT?*@=e1~iHGTXh_D;DN##8w= zcqx2Uyxz|6d8zO5n7+nfv7u0ybcmhNOJ57-4uUqZ5}P=0;+4MZY<~JCsaXifDH{)> zHpN?au2}sDM;R@_Af48aIzp4qms}o=C!L)v7v2&T)_-8}YpA_pkL$%{zChod)lc=! zVB^T`t#K?|uwXJ$8k)T2V4_x)l$y|ISkWt0Kfk8e@Z+FdL0x^fXC@La4!!2orEnH` zzTg+wt4)QeSmnL5c?i z4^=4Vta3DMzHsWFg=R-pEm_AV#XgaS9JG9?nW`crwkq?U5dk+}Z!y+hBr+pxuhmg;sifvjl6M&nxj zqWjecz9(&0Akli=+maA2o8crdyBt!Z+`;30;Uwxbc6(U%*q=e1olY}m$2c~T&BdSu zSMSy7c*PhQn`Ylmpe@bLi;XttdhVx|owMgRYudJ;$M*OKAyg(&&Qj`b^aY5%;kD7Z zq$cro7vFg;TvY0KU2>}Tq1j|@Flfk9DI6{|@zm8nYW{G#yItsj_spl^DX1>bT5aVA zWC7DQZy}VLhR;cHr%y*$=Tz6@Eo`N*NT&w@7V54B1<*$XP_h}^ zsgc>t5x;(6f^C!NBeLyI>CMNlhWY*P%a7K(+A&>FVunS1u$npfktv6@ek1i0L7ZDjJQ3=>a6eWfAG^;$gL z;`o`Qlg*H6f`!f_N?S*wc77@GlnzES-bkZRDVhPDogXgjJQ3h;O?x^bJNAqE^<7Mv1 z8OQK<7sN8VC5v_0OAKju1pCPcq1GN=DwDGmqe&pXuMHOxQkW*S8LL7%hzS;!Tl!-b*EyH&@8 zs4@S3!U^LR(WisP0cBug0Wx9E0uJxj`jW3}M+Cn_UpSfQsFBKl?Ny2WjMC6P04iPj zh658%>vP|L+|cWX>zR?qskX(CE%AgSUW)e=Y)cR;)Mq*)Bnyl?C241$oI0M6bWw!J zd&f&CCw<%+AeoPTFIFxweLs*gI;gCNm9hk1PWXC2F*hb@DW#_o=FIsCkJA@@=qU2Z zE;)<2^9@>#z}@c({psCf+Y=+%x3}EGNBI3UH($x1sTtc~i@$Dr)D&rUa?pjaw&=M= zZeb;w6;%qsA6K{K4d4LZe9*>W!5wlv%Vl6d z0x8dHYUI}t5-Q{Nrrqbbn4&~MHG3GR3fJ=^P@y~s*mAYGL+59?=_@#ArjP~pkT@93 zfaoqil^eek6{(UI@8h4j$#^35z|xEnmzZhb{A5v1Iu+WqZ*&X=^M`*?N{zZa_Ws)U zjYi5B>cG9}=9N&1GqXr9xLPy_y}B8jMopoeQKUUO|0Da=s8TDOR}$;u6NJY^c0B1T znptN180A6`s`B|E%Ydsyw;dSDoMvQONdz412gv;!-S3VZ93@S-v~$IIzGKgUcaye*-c*;C{cOG5FX~m z(X{+r9dco_ZLoFsz}_F+5}rgW6d5GFlzq4MK-J_3o5z;DFtw( z1B2+bsL4Cm{V$`~rKTIE-oH;Z2Od0y_9C_KrWzk&Oq@>C%-W?Y_g~wKS8|j4XE0=W zG-y^9Gt;M94K<51p!2@gWibFF;g2>~AijR9GyW6sYWh@( zX$2mrjptuAM|J5w0D-k7|J5?dYt_tA*B>UVKA7+V0-MQtAHe$k2=Y$BC*4xj+iiv3 z3BQ|mFvv220yOjVTn(bXLCGm;*FV-zZQ(3hNc4S2Ba~R2`ZTz2<5EAACa+D}v=u2w zOwRg2mm%m@Y4eJ2s=_Iz zigonj>Su-ioHAS<{#mp9H$o&|qG^T84TUDXD{Qb(Oz!r`dcHKleX4kdiE?+xbfO87 z(A~6?!{&M?_(1Wi!?#2wPg9N>w+*2=?zIsdv5RX*`P?AL=Q%({e|@4g zkARDjl?s3-~||wGzqp;vd1s`6cRq>x5~iKY|`MY>~9CXSSJjmuA}i*X0m20!sWr z!fG@~jkk<#)VxJ4x?Fm&gE|yvs5gNu8{h6N*Rp`|6KvQ!SSH$QUMqP-gyAM=qwc3I z9VuyjA)@Q)^o$8SZ%#0V;6ILVRpN5ffDK}E?4ZN8y06x#(S$FU>Nc*KQA>BV9lw30 z)Ti*2Oy22L1rNna@sRFi!QeHXtpBSz?KJc~k^f7iVI9~qmZIIgsNLMWQ zXF((q@?OLEdL>90039QPiRsx*kh-SE>#%tfz&_9!2L>sSjz*NycXzaT`PNzB_Dy9@ z-p5$}bJ@8XG!XTxSrQ2*ICkFiDSCg@wxo4WV7%~?6*^jqb$&mj3}HLNM>?DB&0iY0 ze3oMtNTaK#GMtwkvqLmUA*bGb(R4c8z5{4sTXaKZNfDy4CKYN}{>?Fi`O37dF&1xA#qb?%q9h5FqzdXGk zdny`F=DEF!z~?QV5UV)*-o)J*ha*r-cbjR+eT8X%>!;KPpFq#TWAaP}81jR2%@}z= z%|cFgtKf9d@Cg$%FT#!QU)7tub#Q5Et4@PML?%~K zYas~B`)Mx--dGS($zYsG!h%Kg&S{8Mw(_~8;Jz*eB_Wer0yz9n{7`P|ev{sPLX)cJ zU}&5$Zu_Ux?F=iowRdu`YO$rz-0M(B%-Kn*xbtkMC>A=jW^R2jVRLu-G_A3({l<(+ z#essDX36>Gz@D16(~HPgeUh&9k!VEk?A!&Fk#_Wf(uge{N!ytFURAEi*vb|W$_dZJ zvH4K{jDxe;InEK`bZ}d8g%9tL;S2!GSq|_kRmSMmk{LWsgh(p-g|nB#$*65{YrPNg z4QNN*7|x4$fZep(ftbbegpHK_n3xGPZY*h)O5Lv1UH7h8!xf_>9Cl^@wlrcr@>;Bn z7Sg-j$w=;jCYJ|2F=-!yg303IxV`3FZ#A#Dj+cdWK)(H7?Z5X%RnhB!z5!HBV4@)* zL@WH1<=#i;WfS-kU;rvV@VCgG=8E#rN=#Nhf=uv()64@W7OX53S9wr;?$5GWznk)c zJir(@W%1Jteae*z@k5EW80HuX9dDhVkc{`2zyB6=9NA7CFa>+g$CMf+I!-8C>NQE? z@8h{&l$AkG%>+`#)E~*&Cnjg#Bx<9fd59W`bZrK9^qjLED`fGFt`HGckJWuiCJ!--;;|E_{ zr6KX}Ftz02@c`{AykKAX==lodV(ho}nPOXuO0`lFNem4%jT-qAYZYh+wA9q3 ze1^K4XqoVc=@t>FbQ&x`wB~FRGC>{z!!|(*kyIpQXx!|)n!S!lHp{o3TtI!Fpuz`( zdls04#vE;}RaDYDzL|YxpS?b^>dh>;F6#-wDs$>J=WwK-&)$HPH>WjLJDKqjP@Y5i@_60f>1uX(C1}lw zOMci+ncRnTMtA5%ZDRXf{4Y4TiD<>_!1Dr1%_I+{aW)CC7(CVtKNBi8KNW4*%3qd^ z1G*pE+6BVNt65%kMPnE@EYm~uGoK18?q{})OF%xjBE3&JQM8<;|I47P3tk&QHuq%X zNy5ieqx0Q2s`!(lvolpQDt@mwV&p5ji1kZb(G%zpR|L%aL0*tq8pb$!vJaN4O1jo3taWe@_BEeT zf~O?Fx|T@ZpDio$@@=)i$*aV4{sg^Od{1VWHbkk%_l=m@MA|;w;HG>;2)%Ne+bh^) zCx?QjUI&Ze%NB_i=RicVPe)>JM28%qJW^8La<?PQJuyi{4kULk^q%H z^47sy_X!dFr}OvruAM%Qnpt(&s z_xSiFdS5}r*Imk69L4Tl^Xm+U?SHeBb_&-IVI}l?WvqOo-@Ecnw;MIQF zNN&EfEnSlp`0j;|Ikqel`d1~m;|^~04Jv}jA(2<7IRCu;y<@M;p7B8CzcLgy49_JF zX98a3ckY`c=~wU1gZ(AsL*2fJzU<s?l)d`OY8#^sNI#k4eIiiC2HScRYo z#WQzh-s&|Tw0+|fyfMhXbj~cVOG#X>g$34Va2m6Syh1Z3t0JMyezq3@Ab=te)4a(hC#>;>8bq$3?0scL{x1Xt5uM zTfh+GM*_k;di=H3m5IJB2Rw$9HqC>(>&nT2ZPR+SYN#$v6>TAm&sSv^>>CPAGPikj z%k;YMfn-HJH-rn*g9S3v!;8MwF^<|p!Hm3{SHro?`#ySKWOzuHIFXM9?BRid5`&rE zPuupXvtY+Vu01yd6T%4@`SoBu=987hsJH~DfKR~6Cnu81VDHCREmbSnc`~nlDDmSC zJul#fC3=OW?#aSWw(syDB3GkPQuY36ZSe0kOzIX;M_-zg=z+U`^l-UL+~Cqp;`L-v zHlK7JBdhdRg%aoWIzJiHwt+=Jy{V%KQ%A9~n~bpbOzgkN0}mjSP7x_dNyt%}E_P#@ zxK}xL1EYj@fnw|*+Zpw7{VfO}j*cJXx8q~pDCWD6 zW34{GZxV#hd4<1D!k4`ikNbt1kfQKA7qyq9xQpVeNHrxx?s9JDF$mvZtRZjKz5jv( z)<$%05`GioJSDD`%K{;UXa1EAjni|W*ojA5%VrwKY{Ix(W0e+HC6`vnAJL#VFzb!A z`0Ijas51F7-N0-u%4_k`2a+8P{q856e1)9?8P%0v5bUH>N)v61F{YExR`wjc$EQZN z(2idTJ*X2V>j=AWjheSD4OLSOZ&SLsWBt^rguKIr$mP>7*yfNWY+KtFH_vD?-f4IO^360Ws_sHgovgKdKFO%k9U z6#vnxFLV4nuiGIO-)p(*Ozq%4R--%p+AN=CifaEfBH)il&tJ4By?f9143$-_sMOM4 zVoS0YO8(`ulF#(l&__hicZSLDKcDY66wG`D^n{LnV`u)WA;$y1=$=1!%ME-L6R_i1 z@65CIMqA35?{7?|eW)L) z#p$KRo?Lw=2sgHgewZxU09|ClTZWZ4w{_W(sxKFL~~&nrR!xXzL3o1TQUz_6fykN{=y zTYGY>X1}cYXGzWxB(H&4(OWF|E7j$-6Sb7iH(bA z*=p!WX1s_m`BHKFK3&P3iB#h#4imuLSQ5ld#DIT5Pe}9ZpRXhsm>~ZzS_qI!IrOFB zURaTPpVV(U13cBLMu;cqW<4zSoDD==oS}Pq|IesDT9do?Gqm$X7eDr1a;|?UBu-AN z>XZEDWVxTm?pa0Fw`VbBR*xTg)J5AvZS>~T)-wCPBJFz)X(HjCmBqz~$C5T*xJ5*{ zUTRp`Er<~Jye|8Gi}g$SWQe6zT9zTY0>A9~oOyHdiM`XJUei;9Bu{^a_LfY?)A+ug z=(^phMd|(`njPJN!vYsygYc{`mFOkCR&^20vXu2Vx5KJ`PPtd$P5gHDQK%raok-I# z--tf@k0eX?)4AaJegIed%F3s}R8E7tSF0k}7b=qWbX|S4Tuyad&l(6ZCO8xA+tvo2 zR0}r`ed#HCQgFFdV(p-kY^8)=dbcrVjCbrW*w0T^s#|awI^G)W-VLrOT_eYPpT$rR z>S?cLUKUfr3wnH@pN9BQ;Qr*{y5(`C4^DaB|0e5hPMUh!wLkN|3xKH3>ickxEczMPGjGour{Ep1qaVcawJ_ zx{ZTGTemh3|9?-OLY>ocM&Jk?v$S)g%20B7QZ%hRo-R`q&*jNBPpuCW^?wCdIh6co zHULcIitV#w;pz~%<8@s*BOpkpFF)Gi)(3+f-J`<-2}!O;4_09!uM=f1)!fr~cz~UM z9$~`}$=`%kEV{=~pACm(&O^fe5>s1%AjYw_|)B47^M{tU8I znK@EXpupEQ#<;U&>~N&{jhf``IJ7_0&^zR1A9o3kNZWm6Y}CDH9Ouc|nL9K~9H5#U zapsm1bB~~1t_5h7O0%!w4gq;=kQj;+s##{Afq_zpY8n;~7&H)3cRL{p(FjDV{1%KR zW>uH1|JKnXfs)}q<`3FI@dA0vioQ^hLP+B+=h@pdq~AThzRR;k|9p(np2R-^qgBCd zBd*tA)aBpv+jdPdH*$9zH7&wy_1y8=?h7l7%HBqW4V39)f40{lzLj1OKc$U>dVC+u zNwU24w-l;ja~~#^`XVxOUd5!ZWx!b?SMPzDHo|}IM@FNOYyWJW^Fq2H`A_~ZhPM@| zmbV(Ww11e+&3q~-I#*8moMp)!ncEX{&=b~rHKr`wa6KivcZ=NGwMVEjz6j$G}R9&76Nb071Co!FCya zP9)upyQ7Qc);sx+P*OH4?-$@89U@4fjgq1osjv8tKhPHoTN0FD_p6-Sz#^lt^Drw# z@p!US33oiTF0ymzcp){bPqP^(E?*pMQ<9znlR0Z~xyk0!$QagC?Y+tQNudJCy(Lm5 z+Ly$AO)Y`}r2{xf?EyxShUJw((aH54hrW6hfp9v-nTm(4`-_WPWgTE*e%Y>`5g_u2hWKULmdo9~Q2_OAug)OPZkz7V1uysY}!KwPzxd z%CZ{zjldRe`XS9&Pd`0XO~nL^clN6&hs_saPkufLQs}%8hKvKIbvwq!1Hc|fjnH-^ zMRp=VNz)141`gi~3Jw-rP=Hh+8{q+_GQmU_A=kP~!0Ms{j0*q?vm!0*M!C1eMr~c4 zS+yO`&1jC8(q0X^t`adAa_R4*sJ8uyYWy#kJ5Jo!yik3a3B%ZTMqe>;C1-)jZvUkNw5kM~+yTj5$s>ui@=y8-*TY z9eu_|y7c&3KrEcKS1oc=frnd%8$PMkgH>h`ezUycVlsbi0l&D&{~_x=!fm&UGAp$Z_b^&z#-jcgg5z*Q)Ifc-}TPFG~@%J;@92^&tU$M zwO9|GxtumF1X@wU{`~e-|I{iXojvuqjbwg;4&kF3D5O$^=%WHFW>zxDX3tYJrsNX0 zw-XkUUZ2-4zwP#DS;STxl{WZUQ3%DYLAa8YIy~(cqD_e4UmVoP7kMiAEOs#V)ivW= zG1XgT<8xVe+yz~q3>2MiKup#DNeY?%af8j|1jWFT9*Q4+9e4;~(+DW}kaPWKpep7X zwE8bv)yBHxLnC9^m#^1gh6WyjyvqU?WZ8S3g>8fb4xO{kSI&*C%$u&EXakB9D^i1x zPZS>9;E9RC1}14w?&q`oRlOFNT@V>_FYUXKqTBbq&(#Nyn2-BEz6+1AcgR}N-Z*f{ z&qUI!fG->K(I5v1`xOS#f!jcGJgXqk^8jnQBE9|i14NJopjuzJGXdnOQYArOb2%uZ zwxN1?*?HW1{-0_ncW?PTI3Z=e2)oLjq7s?+QO)WNn`c)d_Wya{?q>b}7YuWK zqo97p)Q}^k!lPVaaLU7O&D#Q26!9k30SC zT_b-B-}&H3ajaJh5G_(OG^P8jJ~Ld`*M8!)hN*gekn2Y|+52Xrly(jJggfBlAAsQJ zdVV=;q8S-9Jni41cD~q<3%>>+lcNmx45_*QI@H;VeTm^JE`B&=82#}m9%mZ7%sCg44MG`ZHk0ulzdnK%>-#c zqx|cG#uxVL2lSq=*EyeG`D9Dv{p&EGl9ox0maopUvs=D~2{O7iuRjX)<{(8o82?$gJA6;uE9 z9a*ex*A8&+-V^^mQ41=Rmva8+dOHsIk2M6;-(Pjba6kPCPEH$tISH{&f|A^*Ph_YH zKsx!w5KKSOf9fch*Nc%Wj5pbqmv@K(NkPp^yS5Ggx~lES8HWwNG3O$s7NHAWBY*xl z^2j$z=)C&xo4|v&jW2b1`=c&4WUSn{5pnrndJt5-w>5})+j-jXHEf}rA?|nQ-2STa zE!sVPFP-!Q9rJ&WbN`|8Tzqy!=HqJ5sM0^hXQyDNg%sxG6vR7rYHRURa^?HQKS56f zn)~S(w1+?35ljib$92mUILtJ#kr%$@bA%HLlCoun1!uo&sYGA>_xp%VKYSk#u$Z}D zU=Z=2lh5EOh5Pwnkao0e$#B0Bljv*lYZQ7x?G!*O8cn-LW8!!J0FRdg>TSzY-v3rZ z0q)csRqhAew=P^rIy8TQ9mmTWq`&w{fzQWrSJ#2M5YiMV88`LplAVbL&o&;E)zr8B8E8_Qv@KcI;bVdb($Jw9JFF$?vI zSUUd=Tqds(3s5`>4!}1oZ{20pthm98vA8eN1t|UI^^Thsb z?fCKn*ezCF!mi2mbljt^qwkd!JUU5^Jtk*=+rK*!%3SmH&CM;LyB+3#bE$H>;DjAW^5{V1IX* z6b%K_J{Mo@gTn+*EbmH~*8EdBtFno*u6)HioPTvdp2Q@y?MGX2RfM^|>aR?SAkhkf2t@qcZco#!xp(Y+(+`TEnVVKL>LyZvR?0%%vR-T$B7{K%Zruy5B) z2MY=8&zpmzm(ugeB3yfCLH_aIjZ{HPUGTF5^&6mNirB#!6V%ka#s#ofRlTl12I@<< z-5(Mivoi`!Nj;L;$n0kZ`F7Q-1rO+x+%P|zleHw@!-JOEqm zSL)6IaV>J>;R^K+mYcMKb5$Syu|xfLsW_<03A{L4sH&?S60JPpChK~ZJ(U%L;J+H3 zbIp>!I{jxnyYU3Fw5P~s-yr@}^!q=4_5KAel#k%E^AhM9x#Y32F`BJ zBDgd@FMj$iwe)|hWl;#kJg!P% zeR$-x$e-8#eT8v3EXm)q4wWyeVCqBFx#Gr2ZRiVm?%&I>_-xdWza;(M3K#kYaf}lX zn|xpv3lDNDb;sHlukaPFUiXT4UHfBs!z-4h;q&#jkfQ)ME(_ICEeEQe7RzK?0e^TRK48G*nb|XAkcu;2>4nn zSIru_G7hpJ)H_Uq?!E2G{I`6fZyoltfuC}9op8|hnq_^^9IQXJ8rQEGpv5x%JY}_K3 z!Q>Y?&PYn?VM(~9n*J6nP0oFD%wwz<~LG~9PW#Lcmieunscb<>9|D73cTX|!y8`V9T zi9bF-lYW+TvMBA;Ze`OQiBjHZ~p3SVD|9NO*4x34Bn4DM;-t5_xpF!CB~QZ{W;o4rwrK? zk-vT@+;Q_TEyejK_cSXNfa#C>=O3PER1aOOW^M_Keo^?eAk_TJ{T(dxP5SCn zMvZV^jTYaC43dBO3`IYnTf!;iJ#peP8Gm<&HkVUT!0>!`zA{vAiy%MF@TZepDxOP@ z9My|r>oZ!CvZ(EyJPJBoHcMA?v--T&J~WMW#j;G=hX)k}G{UnJR>P*wq^&k)Tu`3; zNG19ZQ1R@Nu3qcsI`c^_4c!(26?Rf3rYz6L;%E zzJXgWYSak1|IZ!c5dRDM_pgbA?Ul0s1D^ZB0iBrBI$BoSt*y@X^p>m_wiJA{=Fjs# zk7D2A8jEa-jBFSd3xbx9FV3qAu}0N^W%eO?B@vXIgQ0Se>o)-qZzB(m5>!yEtjZyH zQxAU?(-;sNa`#(+#nX5<4??>cQm+_~~3@qW{QLOLWt; z8OLyk*D1vP3?0bq2D!xo}AB8NTuHqshB3b%u=|_Q*kLzJK9shHdH&q6DdD*$LM2c ziHKI09cHKJi;_0-BJQazMWLcM_qbWeFj6V-+tts<@=rzlk-UXO`iiV7^dvrOCw$jV zHkR>M=*_>trBz{nLfP*#&crEn&-&t=t)iS!YNoz=-n%UCOF0pWTqQ|$igMBK^x?Z* znMPSx8&z;W5WDqsKK|HgZy>(N{qw{s-H8hJp-3QK^k2Gc?5UMRf|!aOkaC) z+gPXVrJ3egmox-=}N=2n;ugH?4F*f&7 zwdgEA%G1Vm@r9zrK4V6-mTaxjijnzxB_tgg{9#tFrvg`yW^rag76fa1Up}&0v2p5; zpQs|3=+LZ>b=Io&i71Y>o3)cKN%wKolhr+2UD*~=M(6h=FBR&WHNT?4vP+~olPOz| zjeRz@V3QH!9HnAkN=|>%|aRHt86Kamp@?|QMPJ*n{z^T&K(?^Zl-Kmc8)7p46;t7O0{j-Oi1;Y&?bC` zs#A6s^~PfzLyhO}5VyJ`j&EHHP6(`+$P)#hes*G^O$ z#%Ahk%NUwAg*nmByKB&@Wm$ZqPm8-`&$_jaYs}7UTa0cniK`AMc}Qa>(#0FrRodzV z`z;tMlG3~Ai5a3w|Mdx}?tZ_+tHVDxW>c_)JG8Om5ll1;pz%%=bt;>;54_hJg>OgfzrCfUBy&q2wmBPanX=v=q$S}?)(lvZs%hXbq%L_%HQP=w0j(vXp6js|l-dNwznBoF|;-Y9Z zar}twS?J|Dzk41=!nE9Qw8YG%@-@A4d-_drWr@@rk-5R~CoK6lTom)&JdH9^ku(vJ zV5g(KB{!`ZR>{6n^s#4+DA0697Zn{~QL8Jh&lTxYDm#zzrv7?DtiycFP3xiu*ocOl z&T;JV5@FC|{(Adb8~}cAUN~oZ^=n^<%6I5!S_ADu!TBp9KUH!K3uwWUgEw9_j?~wo zC;XY&2W4tXZWpOzGv79>X{5y~1efvs%#PgmA&X(-%_vBkk6POO z1OJtZP4R&2ZiQc$CJB5-_YRf?kEUidmr03`5$|&8aZ65@oqTr?RU@1M7bgo3*4LBi zy%~|Jb9Z_wIKA|OWYPj$Yw{Gp6z32=k>FxU^*%ZGMx6NFC%C_9wR-$tif^=zLei+k z%6ZP47I8HUygEsB)y=wk=T?K>t0bt??kpo64e;#+yQc9?$Jn-F#y7!a9n13YiT?h+(&anN zIZx%gxvvVi35J~1Vj5-T6`tG@De%TBOlHmSl7xf1x0J$XirE3hEp^hF<|?_KLi6>e zv|U$;NoB}qXsKlAN}87AaM7+}16#Mg`y|W$%W!^tSj{qYS!|o%L{w{V{G%7#__%`! zWh;0W$zoEJ@s+|b>0YmcY%!De{DG%!DAs=Q==&Si(>~nBR;)ucWUh2^(?O(4p_VZ| z*C#*ver>-O8K)`D*RTH+(v$~x2IdOk$h9Q80!iH1?0nn0i{#>M_4ofm5BY*UDQ+-r zmnbX}xWTctVlq8_g!EUrdN=|acQbFjdyC+Kg*^WKr#2!8=X5J!#i}|TJH{Gy zu*WP}^_PZSlBLp85- z+=h^$?&%~&=Db9S`G&3Dfhj*$5&GtJ!c~*Ppr{Bq_4ibHafl21E||Uesu^txacxO- zhq7EgLVk$m1T0fxYdmm|E+BOD;QN9wFGEhf2u*Q0GB+f+8*R+>)DsELW`{fg$VIW( zL|!>1`xP0svLIf593 zKkZnt1uRCaYkkHsRyXu)-i+$4UmBB_LGFpljfWd`U#8|FOq5KzVpMb-zACED^`D*K zxFfh~h~B6%yz3g4J?L z%&7W7%qML1{s#s|_tf6Z{dk-#I{4SKWWP_D=dY4?U*XlBe4?VG#D*N3K6o<)KVNa` zZPgjNu6k4PN9pTq`u-=E$X?9~|F4=(9bPw7Xm|7@x!%l&E?r;KiK?7y?pA=;c@Cac zNs0T7+s)m1B1+LBpm;3m*I6^BV*`i0xfn__RT>o007TbnzUf@&>tH zg5K6cy;y11r{7)uIrQ{m12X;21O-D1e}j+AtIgHQQxA0Rdx(P|XY^;Zo%z4DpL$e7 z-6lqyx&LbJ^zanP;wVQv;?u4jRmd_`n zD?=g?Miu;_5sVsTG#q2aY$Wj9t;TN`z% ztw34!0BdF=FM<=TUy-{iC)dHgEi!w+;@;zj4GaIB;lneT225YvCfXNLTeT9|6cgxt z#TU>k#~gsPFsaGiP%V3hm)Rw~yJFv2rt6r^oFsV!JYBUH&>gqxcy-xe-8(5qV&$Vq zgXzXB#NfiT9AztLys9HB^<4;Dlt3=omSHizPJ#wLM>pC$%VQavI(jCrL{8`=Tq+nH zXnnU>!JbKkV&k<9kn)gx$X}2rUHpn`I4zUjy#0g61nw2q83QS^cSxt8U(A``4qM3JhQs?Wx&RnoGL-iqMZ)5y^QbM>ULA>jD{)S# zfNx-ZxKCV$U#;BZpFyKlEo){<*O?VU>|t^k*CB@=%FZKjcX8x`0cp__q_AS9gn`Q} zvaIF_AihlYq=IY*Oa|i!fi#nDbCOw_a@P2b4nipElfQ0+qAe~-7{~u6!bP!G+h9?& zU0!%e_akXm6vJV3DbLcL(A*_dF4wQpn0Hdj4q@b3Q%`mbRiJ)B$#Z9+~|} zPQg43F(cEFDQBov!G)`}TB-I|yMR5G%zNS~WZ5H65cg~jy>&&o?kcyd-5R#@g4X3f z#LY#-UBM2mXK9Po6JSgQZOcjMwiXKZ{h)>@+3Rg+BwC!=rB1B<8B?a{dJ5dk zJN&2mPEBakCHsnr7hBQ$g2F-g@p|;OYLSJwP%3^XzIL8P zT<49G=@Jz`Xnw#t*Ya!U8v8Z?22OLPJ9)T|kUuFe;NL1gGw2R<=y0+p|5$JK)u%rm zRK0zDP+skwU+=|lO_9QX*9Hpb+-!-Me}J}r;WN9aS&7QSKH_akiL4AEu`PaW_bV6; zHQY;z7~!|{#13Ei*7@T}WO(4z&OpgqK-Hz6T?)FG72el|MtmlrGsqDZA1~{E`@8yh z#QpBd76$_F#7DM>shZN?_fl(8Fs*x*zcI}j_qg9F{4C>N(4yHdI(Hx)RnM06pb3T( z6QrNWzF;*Ch1_IbgXAgjV2MQ zU#K;r9Pq@bcq_%g6^AkGhxR3liFOC?7RJx&RBFrzI16-Fp%#xS(l#Np7QZ!o(!~_| zlb=2w{5EfJ!@y0kE{UQt%3BFvfp!Nvy}h!-ulH68nX$w%Dp*ne+rZr96R($E!gE83 z1fv2Cb^dHNhjZ{BOv)G5)(|(1{uj54!Z}=i27e4z8#H#g{Q`RVwqgI{9@T!ON{aKg z#7sVvlog3O-6vWp+9TVXHgsQ2IUscG1@~n>#v{}_yY7M|fs!Hi(IlhNNtU}rb-Z-ZiNhUXS|u0R8uH*#b4>j0IJ&!x!FVAYb}nx% zyn`Q%;}Vc|c|She(WrXrLa~rHQ3XFkwsU&o$fr`uOX~efz7nwK;F%La-MES-OzX1^ z=m=ALQnsANH(#1c1+q+~!_Pc?&Zy&?2$b(d^N#t*$I;c?C8qNKHNFH{XrYOA5B|ifi_#y9Mn(YJ&5}5N^Q#>(DdM&xgcL|42h~ z-=g;weFqz~yhK((Dfh{3vhH7Oq-q>5m0~>*Mjzd3HTa{4ig)|uVFFU)!gY>>YU%y0 za<}W^C7Jg1mdrC~Ey#(y`TKy?c17fS$VI?1u|Mk;4_3Rq7veHw0ON4Dmy_4iy3sgt zONbs%oe>Qef+|G|v?(aGkrZIZ6*+ma-5rsmB2{={1NUf0_OoJ&O=Q$J$7sKbb1R3&>?j=(BJF9Dc??e zBto?nG}K*imshmn7$>I!)?R zZe#d9KZ%$-6Jfr;q|ck4G7P!Aj1HPV2>eqn=#8R^jMFaJI5&X?h{v(#8%S7kcsybJx9M~GG}Ytr9Ouk>&RXzg-MH7 zpfFF%R8n>K9oz1PO6BM>h)(3dN{*fyh!*>w#}SE|3(!hC)Wkp(YF~^qewI+8a^}Xu ztIY&zU?|y__N`D0cLST>2>(L6cbTGUU?T=kJ5L)R;sZ_HZrKoA=gh(l$jV5QNy3UV z8W(Ex)Y!KmZC3LNepn~eZNN4x@bZ>Ok8nS~(V!0PIGuwshQi&!-RLXAaa0fHiS`uP z(?pu_8s^cNUg4M4z69SaVD!?D{;ay$7BOSgjV?q{_wmf>P)&Xpg-W8T_~#9mSqGQK z=WZ`3o1aExFa#aqrLjq84WkJ>s`j%45-8G-V$oeMs%G?N60>&@M$P!5)nk>n0ZnEl z1FdlnQcS3ratS@XatS*=Q>HZOQRu^nsK)lY4lh7S8xIcREQ(2PfgB9^i5$XYNEjh# zdY4Dqr$ri&=$=AjKU}k-a~HPl-xF>Uk{nRLmKZ~5!1&ZDg$dLe`&>kHXsWKn%69>S ziQwOq53UB&5-nDJ58h7eM|%;{O>{V^HtS6-Y1ZgpYYMCb*K?skHzO-&5}x@paG7ws z+HEmv>lJ$w9fPIxlB}+NV@J>Ki#q)l%d$*-jwekL|4j|R&uBP zk;d=#Hbz&gB7^$g@vLKEf}Fa%4KKc#B;JjE9`2|UtF4mUqBA6CV$5y+@DzfE&wUn# zwLzFzKPYRTX}KbSKK=!5EXZ-B`iRx))P*US;aVz7wo?t@e#B}*#Ijf=DWUH8SEhQ*!G z*};hlx~Cu$Ys-$z3Q*cgk4ckuE$hX_6$%zB-9yRQrDDx5*wq82=9Lpv7ncF*~Sn*sfbk}tYQU8G3oG2fCZJ0tT-jS9)I16_!` zXJD{I6pLEE0V*{(b^bU7M(l?ryU<-k0)Tc-m)X0A?N4rqG0xF}NITWVpWCpv*pWo(gXY3{zAzkMrLLGaEJt?nLaiS&LeJA+u z=IwH0RcXSrCh#@K37sLfPR~fY98^*F-PT&l%x?T_kKvJsc8O^{luD&zA^&X4_wXnO zODN*)PssHryu{B$W7;@uRolfl*Fq^_m21)L=J<^&Bv~5+ zP9m;Qw+9*oC3V$ahuj^PU!9FiJ?I*8BxxHZDCgwOS2#3qr^ovwIC|g4yH~lsZ%6k( zQOln7;V=lSxpPd4=g3t|8d{XMGf-cK-J(|4ZixchE(TzI&jd8l&>? z?Xnrv+`=x59+3Xi4xHpXv~{td*p@tdEEI7Vqx|SpMIFb7A>bm6AjzT4DuM+=$O|CIN6u_v(*!Ne&!FyAgr82AC&MGn<9$lfvqYh zwbl8S!OR6`yVecTXWg}HjKGaL2|KJ?=Y%$56zmM4dl5QsDc@%Ohi5@2l+e0k# z2)M`Mc?}>i#21NjUUmfT0)Rl?s{Mk9D+?1BpMsROkYB!gKe4W#%cB~cGwQ~3SuIqMm64O16{~sO>pzfhCU762jJw}?00KC z_+calboTffgu&tPc#=fGAKvJBT zy1|caw8k$x_`4(w4ap|rQHkJq;qx|63nJ+&ifpY>?zyXo*(p!g4>YMGNOn~baG)(zt9ektuiyRlxOte zdhP?j=@NV{fBt~IlHX5AAZaO^ajR);>eR`I`!v(3M>q)M;gaZ7Z%-XAcFaV~UOgx4 zUhk>uq<$e9;BIXIU|u%_Ib0+}o^pfc+E!9WVs!|vD-}H)ed=4o#bFRf13n4Vn7NC> zLU~@vrSa#GGkO$Sm^=!1dR|ZK_X0;HH!8Ac%M`0KszlG18&%s;n$?=TJ??fnC%l5d zzrejQ*ZAncfK)}^`qY{ELfg%Uj9y}^%ZA2~j|6fkz^yu=Z|-y+nAC{?Vk6*SnQ9(Gcq5i= z=Jm8|G6u1Acbs00d;E_1AX@bJ(7J3=gf}P9W>~UHVQJO7*)*I^=})=lqMlmUFR`~4 zog1oW-o35`^ouZLd5jBA(xi(GfdFnv2k)6$nFeupSaBM9Wtt*6r;d*huNcILJ&cI- z^n1}%3Za_za*O;+OZq=^-utEhOT{m>rb;3G9B$=25Zjyh%asfyJDm-)Eh!(%T$*sU zeRk#M@#BUl5mm?9bBC!fmMYOMgkYIN0&UDx8?;A~_4k=crp+5el7R0`_v;YPGCcv@ zyLGC@OhN8^G0`Lsm>Z3Zf`T;ay{-{mQ3R5gYP;)+HJ;@+vksebdYU$+)m7l z>UP{q+d1oadSRJiyzJmvd*{F)Nff%x#$Pqhpj$2HoM!;!i*ixlU05T`t7&W-%4hJ$ zXG9+esXWNQBHD8u$>yv;F7HSHp3s9tK1#`{m8)ev3Rs(b(PT~1(RkfncUyxcOx(dM zNA^(}YivS_xWFjx+V&&rz|Gj39|g`d9Zx{FOVTpdUL?66USeqFIwhRunPYvM_(^P`vKb#Hd(tS z-!G)NK_w~a@Yfm#kjDgm1nlTl$>4-tTqHNo%zK?yy$%h3+@t$P#mm{{#Rx2xK#*p1 zn1K#dcfbwF3MC{`K*HfSp=}n+w%r9${9hqEw7X=i`AyHBHZ&~)C(6IO`5 zHL(hw;pI{k_k=Qa>JI`u^x#%sim4j;%(v+W?E@6dtUigrgH}vn?bIzk@1jml)i?dy z2zG8ABkYhmL=W)WL z=8#E@8x0aM6<}Ez)x)vX#bTQWt-LKsBa89x#Me6O*^*Acm1k+1G&GL7Y37cI^1Sc_ z>pFpFq%j_0NW>Z2o)oN0r4=BxHRhroeu<&;O@#ksAd<23R+D3)?fo??ujY24qgeJy z;bQ(mTTVvGYW_$s1+biT(oGi_t#qvQZ%$yZoN;xh2_iKjS_tiCmv$0Xvxjf^;MVT7 z?svLu{TeUW%_pfywCz7$XN163MJ6o7LrZ2hU{&K$di~)yLJW3j^^}qYV`+ThnU$(= zIw5UCmW3{J6JHVwlS1=I8#VxDJlt;O*ge&86mVN}Wj_|XwQ<&|+Yilz z6es=aI0?97Jrj9}x71wC-Ampb_8>pWsU5;Oz+4hA8qVi<0hPb+jl#mn_pExA_scxUHlaj291AaU9V;g6>8wJvK%Wu|YeJ69< z$zRd^B^SQ@HK|ru$AI-wmtZ!VfBKZ@195`n$2Epgsi+A|Tv<7%PZTM}o;K!e#X>>p z!(Pu^0@}DR{+2D$rv^yT?k?|402?8*B(F&W1?eM{HtAbtJn>IYjl6y*g!5=zwv%R= zgOwuC9cH*R;c}EJDet8%%dNJBbEk)%x^>bc*Nu3rVNAphn8JA$cmNbzt0=-=c{d>x zJ?dNCg>n^UAJ!aclOjDdCfbU)C$4v4YJ2atk#vwTc09Ai)OC%8A0>n_}L zV1Qv}u%w>I#BocZskZOl7#T7LAugmwgIiq;$A(Hn5>&G@kgS4vOax?_dNt{8-b-^;vhFtC@PBNl!M$OnB|x)?nZ4l1Q$(=tkg+K2;cxiGIqzAWBxE7cR9c zRD#9CR2*GoQnU~S!G%_C=TB+746~R6o}VGhYi||z=a%AjZ}lnA%hWa1>XSo(=U;Rp z+9VuIIDiI`QCOu=B{xHP9zhA0=+hrsGt{Nz{+bJ~Nmmb$Nn7e5^o+0RNdie2vcB1G z2qk!801h!$>>n-c;b;~wWPkB+sULf`FYBPX@U|y|9h$f-Xo7l8eE!Vvd)-TMOs?qg zeKjgZkb{>V$C%sg`@uDER($+<_vTLKLuz;9(099MIJz6zUBbHBh?JL zoGTBu|7-JqeR24I)R%6+Yh&RRJ&QCcLy#O&U@dtHXa>yyWg1}WiUZzcBI@@(3yIcO zqNw1}I}IA3F$kmAr7qcUMn)eyDjJ?c@IKgvPygD#Tn++!TAGljEFoV zjy79vh@^uibk?dV!acaPfR$Zdd=HQpq{c7RBF^)8!5;fBh}mkP#iku7rSk^s0v=Ea zav2Oa-ptx#aRzZwj^F&5#`cd;1sEnB_Lrv%R7Gq}?&n$sNnJ_{=LHDDMi4NMW8C9Y z$doOf(S9U$@CbAq9Sdu-Z!-8?s!q0iT*DG*Spt~5lge$$4m$1t86i$M@igy_Mk-qq zY5TmjjEVB_{SoE#_@(m^&bPjoX*}_0I>I^|j%638TJ0qMLW7&A7cOX%Exp6Ul*Fs@ zs_|~@I-#v8S%K@@^oAw{%j+UVarBi&n2SLkq_;|Hg#;3 zTbrZ-z+vKP;HVURGW07{qs;z-?&KVvE%{vN-Nw$>XgexH+|lS4*d?MW+-hW!T6TS_NaRyW!>Cuaw3jig4S(W4t5j#6fY)YT!Kt%jogJoRZ| z#e0O-{!oMaK;x8SlVHEfx()kCD7Zo#<9#x-TNsb1vw5rtd8-plShgcXAl^sV9cC;f zC-8gk>vM@n#eC#MVp4>Vrn{Q){p9c;hqknTUnRi0032N&rsxSjN-eUn%E^^W2f@|1 zN7eET!*qVGP8x$DJ|Q1pbAWbBKZwImL(q2fnn#FkD+hHZ0AV-GBHjLlEaW^Pq;7-ML}jzL!tAn|x!m@T>O65t1hB z3yS)eZ3U^1!B#jSRt|G%_w_|h_86f0Jgp?c{?1$Cma5WAy&H)~BHlTVC zHy!Wwh~?3?1L-6z7`Xh(eX2#kiA|lG;yZIE+RJmiW}SG%ToY#l#Z9%Gj0Y$8aicM4 zH4=9A*R~$a1rblpsSPpo>=C;xN0t$PKJzyzASp-e+gZnY4zr`|FJWnVsT30Bcw1(Q zMWq|gdnF4tg!u9dhYa7)0QlBure{P>mZ^=zBE7mKc>)8iN;$v9Kz_jb7Rnv3KQw}{ z2H$K_w_@{XKmD`iay*>_cNxNOgIV91vDFyCfDi=DdzBVgwnbA6WsM`-e~uqqB}4r|}Iye{_wPODwj0L5u&eJZ|vh7LLG9;A6V#Ma-UVr=~8Ex47vJCJ6fU z1J)_?_by{iX$<}<{Vj=ECvEE0qdC3A2Exttr)`BODezQPRa2((%!JNdOCV-2Vh-|+ zkb#iAUJ02L2Cr@`=?U@IfI2a!y5|)3Jw%Ra5MsDp1DT&cj-8X(*w1{(;7X5w@PgtD~)v6rgelY8g z_e8{VW9x}0GlRdyH?i*PpqUHPM~VF4iK7mR~$%&XP9B6pC(b=A!h zeKX9?l~1@Uv(x{NjAv>3EF=LQw~1rl(Xk-s#Y6;)Phz_+P2&C?41G{$#D(tvqqkqE zN^S2f@7mkT6H~rTEdovVyY`5+F3>6Kp=mDmRrP~}$vr_M+sJ8im17LNiVpi1&T3Z= ztn(KON1>-M;E2>s|7<;Sl8SDI+c>XEmRH)0OuXAvZvouvf`Ith&kmW|{^fkx38G>R z;5 zI#tff>?JQn&C4_rJxU)b9I?V#z&;?3c;wb<5Ts^|I0-Q!ofxuSe1`wGhID8^+klX4 z#;(r{cg_0yBk{jNGfW^ldXUiNP|c(7xI1r=GMI5&$*?>GUZ3}FTlKMiVXVNWq&Z4TGx(bcfH5=Q7+4NY;|T1s18fJ+U@8!+r4-iY3+=I08?u zDZ2?#N#9IfGW`gs5^OdlgZ^qO^jtns?4xxb8^G=~_5R_Fvi8>2+@d=p$|jj($JU~m zGw*NVH19iH^!vsFWN3QPj@QuHN}<8rl<5vG7JYpTKc~XE^k@%QpFH8))EZDIzJ0)#e@`-<%%p_}7idZqi!0ECyFL1J zHYARm>>xf~Ix^t%5^^nEf+R!sZHB*MQ_S0aM6`fm{b{b>gkj|UHUmAnr(u6`^j+`D z<$cbd7kfKllY_jRsLgfdcg#=DSQrjC$o7)mSRy() z#mLERKb8o#iV;pWZDDj_XpevPy;|-FhU|H&wmCPiaU1hU35mWQPxowjg&m&DiKIx! zwD>HMLIl<0sb6(DF7}9Ld$GlIo?*`>$?9;jskI1r&+^18@c2Mj!MVZBR z)!85DQ=kB;bk0B{ohft~kWyh+EQ^%zVMV%3ao`+a?FiqF&U0a8y@zFrKWjAtc$`Lp zzCC_+_C>OBjmyCCI?p(>+bO!qut!7cuw8!x1_2?@Wwb(qT9UX&70mT;PBu`$ti*#y z*0&zE=aPnY54lMu=$tJ;;CQ#ELP!E4NZ8#_H|8+5?v&??a(J%KhzGO`$|*g$Ii|vB zFYK&63!7UwGYYMiiErE-R>>0zmO*Olx9Aw`E@%ER8^UhsLH4H!?>ouV6hC#{v?I@r zs50Us%cZo`Mil6Fi%=D;`!-{J2yR2c%-_*6?xbsr&^Y(weNrLnI{lk=___77oivZSp7n{%MJF^Pxt|$PElC&DgY1a%h3ObJ;P!? z|Gs6Ls2*<6?Sb1qNV?D8r^;PD(SpyLV003-z;5PyHAYV{z4i@E)VGz ze*6@wLgW1L?cj*zjP0f{ffgopWK2;LHjiD<(z46N^#jDVlW9v5YI#CMZ6#9`8is8VP@#4ozPEHxF`~?2=zF-)6 zM}rERK1Kfj=z8yHHXrbBI6;ltw6%9pHDcA?dlaQ=)T~ieQeU%(1f@ppP0bdyT6@$= zXl*JLTM$L;y#?{)dEWOu=Q+P~-gENL{YU<}&$;gFb6wYGoGw{4b{B@d`+2LECvkar zM-_D-F;CNxclcC_-~)B}2c@etOow5(Vqj!kbbJ&?;G6ldDjQCr0v#9^xe9p_Jx7yR8>x%aQ z%;w|#$pFU~?8nlim~;MQ%3*e3w@<^HYBdStb?I>Xk3q}3cR=E+K)-*C;-2sH;cB&) z2X~19D`2%JB0scPNPfu@yp!!oKm0573k((Y$9rd8@aG92Tz;=mqD8J75H9K!*J-pH zA05!I*auMkrE8Wx%rpSUqX#0@!(9@@y$5}w%#`&L^g6mZz~={x9}a;lTJcPo9b<9F zE`xmW5Bk+KIEP{-Iv5J<#3LO?xYyz&3PePHqd3$^JhTRL@5$T6%gHdm(qfI6XNEZi zHl)NJ^&JCA%bwHpvBj$}Pj*oAQ4I?KKRSkeRX%K7QsN_~09f~2sXKXnQEK^3P-Hx9 z$V)~qodNGZy&`?^`atXV=tk6}!Y$^>0tYF+t8wrW z=(mnM2e``L2k^8vv`hMH99Yjzv#ELKXH#9md4yHUv}iS>?f%cj z5gV~m(Gz0lOi1zNyP5qUM{C|SQs0OD|3MzbIbX7W0Ws6grF%TBZjfvRtpsb?to`Z4 zf^)9`0H(d&wM9{T1X16!zOJB>VP7DIPoF>%*k57cLsF|u^(YXN_%14SPz7OCXUIu@ zH|W5g0+|VHG~007wM*9m-y%bKZpG=3k(5<)zJx$XovwFKK6NdiV?KcV3{K3_C7jEnb zyGc9O=MBaJPgw;dUV+MdLg`tfuGi!;)b%;$$rTJ~SGb1Rcrf2&b1Q`e|~j z3c0=XxAb?tTq#~Wsd~FpUlr9JTFg)SD*5w_ONJURlwN;zgsE0SojHB{c*Arwmfh3x zm8Gf7H_suUIJ2kii`^|e-ug;b)pyT-KZ8z>Hre5LvNwFXKY*qn9 z-AY~b_Y8Za=!v+cD`T+rH{H-WHjDrf=ogdpf|p&{g>gL6{%8hT~ zy`a0vTLBoVPxOIv6o8E2OOp0(4Dt z=yGd_*j6(#pm^P45!chS^p5v|XR+k9f}9@sx5begVqf7FV%DD49UBri_VZI0RY^R* zxQDpAxI1DV@Uc?)2&XvC9>*zn){`)x;;8p6+c~vz`MSSdJRd#kuh5Dxa+3<_F=U63 zWZ%wsEi3(+=6HYC6F?rI5vC5S6Etv;Vep~k9zztB;;y3xoRAp)>pIDok5wYy;qKcl09n`Qutj**CC26)l=K3n~HjF=y=8DL2V4x1E7({HpU7ug~j zVBlEl>;j|$Oo`uy%WN9EXdNX3K%R7R_pC^E*zRqSKXXmnqH{~3lO)P`J06)ICdkdD zMnflKWdQ-`cxniCjd$HI5)Si3=>=_wI*FOOusb`4$szbF$$%DGCSM~^v;d)1YN*8Q z*Q1R{I`MFI%L^U{8jsTJvvq&ok>=iy$0OVo50sx?gqk z4PNAh(!nhSun=EaUlMK33@JHY190U2g2fxmWJy_`;+x-^Z!&cAHDjJd!C8xPOUQpl z&p4}?W^IV;F%BKErS{9{zbF4NW5?DfRW|hgf?Sd;wX5g*(41Fg5=b(@pyAJj6wDEh z;)J?-ZYu7onf(=aUW5hbxqE)M|@|WyfAH0**aX(ScJN*^^)>v^_59{7SK0nfK{QWab4Omy@}SRySU|o?yU%ETWhuNfJa<~lr0|;T zRjDSPTet5X{&e#gdAcm~q@VklA?=kh?)T&QeQTN;Z?}-+k=c!)t~f^6F>l{F47(oG zBUPT}Vz7QE(E+y+gglOyOgx&C+s)G2iEVXuF7QIjAhXGjrBdC#6=cOS3-fyRVP}~} zKshHN%J=N^(!&94F3IYNZ{?Zwpc$^*U8F27$;GDCt(yUij-DZ^Qc~m1?-u6v;8%MA z-FKJ*g&xv7VsKO8Br~fF1AKyAYmKfZO0VlbZHVesJ{g`N1dbpwoA^ycj>dYXhp>x) zP;9DTr@YFrfUY5z|Eh4(&TSKnI(Mx_9{ZhFOhPE@~hQP<(s%1^gV+NO2%D>xgoE zI#VQt-#u0{Q#lTNL-i&aG@#C`wxo6qIMK9qhdm>^%5e~&m(u;K4P{ilp!U%K2aQ&; z_XvUoKkKPHLv;Ej%gFbCak^W?>P!NqlYLC=XS59EF7XCw_vnLww(&c z)0xfuva&8j9V)_m9{62FP`-8ZnWsyuK8lt7Ao~xsUgXao9OqiG!6I7moGrZ={|1Iu zZ8LV^L)7&j`*Im_@bJ7aQP6y(txAymScCmJwBt8gQT)GC0`2V);`~S2wq>3HWr43f2}iP zyI$jr^Wvth8w3$6CAR7~*{qQSBu8-thKGZO1O-kGh{5_~Db|xMtivPj)rx%;7z|J6 zs^XE=o)yHO{}(0XML~U=KwO@1y(mbwxj8>L@gRPt6xVJ&HxQR0%69Gf53Apq&hy#h ze5%A+bytu3Z+(vh#GGMQ+m6u@hW|J**9Ox;YTqoD`|_5#%?PH^{`$U)CXEzvzEpJ} zM3SET*-n>H)(WGR9N>2F`5%SaxjA*V!I#vC9nNambib)vXlq*VMJn%l-JW@&3Ayy+ zYe>Y7CcR_fCqTQ4u}%F3ecCfEuR5}9ikcT%!9U)_F}X%uS7Zp+gJw{@0^KwB3XOKl zVp(lEf6+TG@;%+$w)jY5gLuH}@k6%b+^eZOi)-5>iJXMlwL`>Aqa^!W^55|uuEDFm zl3W;g7x8Z`;k*w&sax9Mm+Ge*3S>U%550O_Dn#4WZOM9RuFUP6^$|JIfV9+huRGz- zeb5jZcg~ph4#44(%|`?P1Ej+xiABO&0Ci!TTD*WoqAh)2j?LHlNrSP*<^Z+JUu;Ep zi=ymAs)Amwhdu34v(Y6s3AYY?F&aQl?iB48`S1fbQ4vvU#xz>&;O$>GyFpn%N#4<2 z+qS$N0m<-k26ExKCxZfP8u(gUN{IO)y?8Q@))e6D7?-$-U)t{e<)X0udf3~OV4?d8 zCv5*ch0U2NXGGYRMk$&%>S zLb&ji#Oi0xbTb$x3TW8sLbLuPe(&bQ{^Rm%y=~TRHspRWb3W{74Gk-jsu%;x$rKkJ z7K@!qa`H$?y}J-`2z!V;O*e)JsDCf(lMkBl&`4ETQcW0ymGZgrtqd+YaVk!h8TFx@ zi-N7I1#RB+M;hpXl3M2^dCC;%UKT`8eBtU$;$+HLXD+M^KQq6r< zulmLT`aJj2z=fO+X_p{-tVF^*tdN5^3g3FhB~8&`Lr^L9%aTMWlZe`ho9w)J6H` zOJaXxT4E)Wj{?rFK;l^tqaK}(!ppM#+`4d>Poc|>#;Ok(+qPQF+w8E}nkDJAy;#x) zM?{V|89T-8Q;d)$P_$KHHpfWr8K#mP7!%P7gPylz{7INeW(aWxbI|jJb^c^a`=HV+ zHQ2VzE!LN(D^mskCfBkpfzuRlHlY$)n_qb`P@CjPLiE76UryT_2~k;B(Rx22X| zx6WkhXiby@QhP1r@)f}iXFu)rp^5=5K07C`{d6(c!IOK6OE?dvfCO$Pb;=G}2Au(k znE`a{r`polVSR5{J^_ByWQOX^IDeGpg##q`xa*+}iCPhxA;ZDC6fUj2UaQ1`8p(Aa zD>x~s9MPjmfxbjZddE9YcVD^RTVfLDKQO1KxF)rtA4~p|0Zaipg((6=xQDwk10XJu z-3?tLt4u|{=44^t>Sr`^R`0klCWLe9F6z0Rk=_*|t}V3 z-vjqF1wKkYV~O~aPW_WM1^ed|V()o(!2cmbNfaWg41>B;OBTii)G5en4PyB=Q~_3N z3a{LeDSxlnP7UW!C+RN205>?YowIrnFUk@pnrf)v#D2OZV_KM}L<7;u>W$m3_69YN z+GB80poOI5d*tAB4gs-(A%-Eh$wZ2$S*D6-y5uAwZoFC=L5vigi!;%6Nth`?bxRcL zypionGHc@7s50%mF2@Tl{RIMcdW~w`HZ0H;Jl0U~WW!HMn5v}gG-x{nB(1eVV~tO$ zb`0~MI>CBw>z=>{vU5&05JC~};Cfa!F7E=BPSMjzeYt+s@@We3Y3O41l3GvGLS`~@ zCq0Um-}2LH)48n$GIinG<1&wv;L#+h4wHgk=QVcTeBX&snQD&R7T18raHPFfl;VVo z1zRWmIO(xyDwW>R=dde70b9+_nL`GZge2*qwpAOAV1=6ULEh%4zpUN*kiL0A1~vu| z^)o3%g$e7;$+ycroAW2m2}_jvF^~6XQB|;y0B3ew$X|Jq>~%e_=re2HPq)glwRY3A zAoB0XY2!WllVNC-r`gQ~zwgx5=$AO$9_@-=`n{XSJ`yCX2+eDuABF2LlR0l>D9Wx_ z*VD_`&)ifVsy<{sSN?OqRJ|vsXpf-TJDUmMP*R*}kMmu#-#gCnP}1aX;qJ1+Zwxr- z27gR{*p|&C)?usuHw}B9>=0~EKRF`x9kI%DH~xB;E$Cm`I;++LlI+41gY#okqz))_ zp31b@7-?=VQdc9e%FMR1&OiR;V7Y{fgy4EX|%`p>WremoT)E9LR^mIZ;D0z63NB8ib+r-j;7dh;)^FsC2$f& z4x!0G#;{e&k_w|V7Sx?U>c6|(78*UI%_#*q_i4jbbHZHf{lWP9_t;mTnRvB_%z+K_ z$x4$Ai4>u7ceUNMBh@B;+D(G;^O%4Z0c;cPope;dDLM||?~BRCc+3}YeK>B@BStcY8%Btg{QE_LjfS-FiBj)9<2X$NS3I&EET_uPmNtx@yo7+sm|axd-2&6^cbX z4c^=!Or0kV{<^zcdMfyVQwFZwcz^jm?SPah*w$vAB-|^IUFxhf3+5!{J|cyCN&lRM z3&+SM9$L{K(qO-xeBz77%8b7YneXopDw%wecUed-y$99`TV}g9K=^PS#l;yrT^4+W zPbqyIamM5L*tYf`tDq*+LDoIHH>0$jtDJ26}0-ONMD*O1>=28u<);+YY|U-L<@}t+&I4 z#sb>k9V_mhb6xw|1YNp=&u;nI2%9FP(DXcEw{+1S3#d}=BA8!v%e>#SWpvE458mw8 z3A@2M;IS#XgcZmboxSkv20YESs=g!zikR7f-E7?-bz^x*!aQa#l40Alst<}?J;yz% zGS95htbXg+Vc25{74qrK(mJbA*`if&nO$?wd{?`v?A1|rTxP#~^Yp|m6x~OikZ=?W zIPOC{R>T)03n3YYUg39S$fowSqFrYndQFT)S1%}Fs9C=GA;6Z(i`8UQ(>_cCHOa3^ z=;>d0T>wq*zgULanA03M)t35oJ>4W;qJOc3wcYqVMG-dHI+*vahJrYwyPD{y zd{p+Q-9ra*whTcZ&C9F9cE9)@R}H|DChjAbum+j3G1(hppGnLN!!u6?r_h+Hi%Rs@ zqdkWfS;xHQ5`tpS1m~XG<;%aaSw9o$aPY7E9nSgHt@t@l7rT$(C4Ev3lx2YvG(dbh zy*n6yk}IP+iyX<|n3=p`O-;B|ci~$fDT69Fk>NGa{uGdmXsRuc6hjzGR6$9F7w|&a9T)j+C$ZlnU zY$k?-h{BHNw@>F-l>W2ryWOs#LY*g9DjUtdM$QrIfPiw(1VsdNq1*`N$rdzXd3wJy z(dzd(ZkOr)HD^tao)@D?MTOcL&%EF^mxzI+$Ow zURnP*gzJqPdM=9;DAkP7SLFhSYoWimF+a3Y9#8%RK>y|Y*7-Db-AUU}_)p5KbQ@J{ z(g^!qknxb({~1Dco7kyJRDO&ooUI1n=0AeF6W%uogH(>YIv7XYnQVg$ZE6oj113M* z*`0rGqQre0$4h9r*mMuso8}vQL>3w&950&Y9N#UeqF(R;PwaP0lbomrV~Lp`v!44Dpx{j#TNh8y~Hi zAy@D>##c>LsmgjXPk(qyq4F^vMv;HMTmNf8X@%yHY_BpwARm{OrS`TNZhFyP_$4p% zxweYDG$dC@>E-c(2oq48?sO7UblexR{#wNZ^o&R1u(ac4)Gz!i`!h1`9iqTP!9Acv ze)fYkAh9Cri}ax_%mG#ipNo2>mxj+a7=)C{vD53**27{ylyk#;J&s z&2-o`odxLODCEt~?wAYY*9)i|s5?}Wn$m}T-uV2su$lYLTcHO5a(24s&t1VuSD>XT zU)-?eI(L4I$k)VU5}(~FJo@af={6S1XGSdzgyYUzdUMk3g3Z@teU<&X>7L(T8B*4Tn#|f(u@8?vM$Y%jgm{?QH`nbyz{aNk&N@kIE6{~wCauopL06th zi99chqnpd!5X-tDe9-iD6{Gf66={`;eW*5*O3QztDKwsa0&B_p;l{t4PwsI2m!Gir zgdy!e)Spi25^R7f<2>0OTe~D}-8j8H!_Im(lYq@hync!I*}>fRw)!lOB1$CH`ex2E zdgnAGk`R&LQz`!v;&Uzcc!qbOB`LO-+ZI!9D+iQW40>8IYm*p4|W3 z>ay|-t?vlG16$h5l;!(wijvVeHoPvJA8kEK44Bn+YgtKD{*wRS*^AxE?V7h`99O-3 zd~iLIneVeqO})1lWoIKt(daWv4A={C8~|}$e?O-!7=I(P9sdzL_`Ie`7Ivi$x%wkJ zN4dTKZr$j@e~Kcjxm^|yh3x)OZEV5dTp{k`5xdLww~j>drJpQ~JI59;`(J?fygNt! zofHQ9LzZ)7=V}&jppcth?Cv4htI5HuGblY2y%%~~ueo}D+gNEQM-P3nhv5THn@k`u z@Jal;{)pWVi_OFAI=3l9dDz=|*lo87`h1jYo6{v3lxFKY4z?$1B^bRiIEc_&P{K9zb82r-BOih2i91c`Qd{i zKFAN3SbZ{90A-pTorON=NH|O@OdET*WC9(6x^~seZ%}1+jK=Z&s(;matT!E`c4JJ; ziUJr|@9_e@`3`_im_rdj5|<=E^*&vxT^jJDq6}z$7~cKkNN0GJju)ozNGw#|fL8L^sWTUx zmSUOuAEcH35_=XS{S^ui%f^q3xhlibvk*k1v2Bb8maSTF5=XWUVNu@?D$zyV?;>lC zSpwUY2jbE-$p{Oi#Ok#DH#GxndZN63wY@9qD!9pgLc=sKLN`}YdoEi+`yEzuw0y4o zcYIAXNSFwV#pg29*Y%I`C5~srM~#a)zQ%nTVQ)#foV^ia^B5Tbu^r}6aO*u7U`DM< zU0+|1Ykl$e(T0}YJ_$%>6yO0n`+WwOS#O&w`?&_WT`C2PyLo=?$P#-@+ZoT~n&*bm zahQCMFekN=UlipDv<&j|b`NaoFbQb8P?6HQ7 zqucbZ%Kpk?%65ZiwBFGChRg=DszFlX2AkbFswFF7{r$57i0RqGl8)Vt8!YGHiHgiJ z^7_MdENo}{Y+E(}W!VQ`lbbfbQ3=QyJqt>|9+>Y%wF15bA(SibqRa+QP8sh3D-K?qWN^4}ZYDpld+kT?7w z(<70M6elI$lkdDoaanRo9)aEr%ikHDaDQH(C%;s>4IEp+Cg)zVx+Fzqa-I#Zvb2JI zzn0zH891F7oFc-1@(DHe8I3FZpJ&^$6zc{P54SwXYsGhG-n;4YWQ>k(EpgR|y8QQM zf-hbdj*G!xy;3}LXo*&!D-q#i zcU5+7?`617aDu_D*8~;c?76k0J1rd+#SoC^kV{L1YFLrNVLT=Ja@}D<48MqhJ_PFA z!aJ9a0yh76%+W65ogrt88>(jV`>~ejebtMsW~W60ia8>{k#`-v^p1vEVqlNyYVh`S zjTd3wKYv48t0@|O-3SR&zMT1O|Lu*2p@uXQ+hRk17DY`4Py07H1q08Zsz-J1@QaO@ z>K6itr(ycjjYAs2bxh1`t6teo)-JriX2`jG;!m_O^`|kSmL4>T@n{ZhmX!E~F z8txx}FDPha2#-myhx|jZ#R6a?EM$mjV^wJvu%$5enhjV3z|a|zZiwV=(QC|baku^+ zu9*1?o9`zE3PPnGJt5y&vfON>rEsd(I5m5q#<`S8L+lq)d>rPimyph~odv~#HG09$ zs(=S#okI9IDOGiyBW8O+UG@;BeS_T9Xx$7rF_RxGAM_mr;8ggKQ??radK&e zxa)5r|Du3Eo>u5Z!LIKY6{iQ?t@;D&=L%o%+unw z(Gym6f%z>w-VfSR`AUg-{Z8T6_w_HbG9@(yhK%4TIoG|akn;)(f!XK+)C=g673{n3 z9!r|D5%fguQ?dyw+^Is40hJ}6FQMs0-`zyTU{i~nRtiWsafaBH)vHen1VmDOvRkR^ zPu!Doh{)k8S!wzF{_su@)Sms}T$@K-BRK`urIhaXoF_n-fWd2M#_u( z_0K2f%SsVwt%bMIGK10N#WWxmZoHCC`g0YC8m~2Lp~?lneyEt-C#&U{SDW3Kozo`h z3a&Y~9(_EiYrjUPPx`9Y4943W2*1qXg(kb*=l>JO3qSh#(KRK}&!P<#sG<>YDPQF# zLO+4OTT+mt^@-zu!v3m|Y=B~2zQlfJz-%u8JtPqx0!JrzhwdED4Qi6i^c&D?VI1!L zqHKM;_UG)ZT2Tj)r2KC+U|y@|9>ng(XI!HY`5CGXS?&*gi-fM9nBv`KYu>eI&QBQU zLGzCK3CM%7`fU~LsQ+whtIEj9;_~-q=(TR>TaZ#-U6gqH)n=&TLv{aO#2`Yc%Ot8P z!WSA>I?uNM$evFs^CB*qoYHEUylBXB6yOZZ19}7ci7bJ- zcThxUL>qFlR-~Sr8+r^J#Ct@+)W$&Y+u@$ie2+*JGWsNyJsXWsM!9z^sJA?GJ$X%* zMjpn`>401T*gJE?Ixm_d^}*4^&;`Z4@3+I!kOu^UBMWjg*KDIWm4Q z!U`Wr5#FlA;>sb9LbQyAjD&7BnuoUBWTEi~On-ycH>z>NSwy4bKNa3vPmd5CPS>{~ zRh<2+&X9yxr|;*dE18HyOx<|)&2=`@kDrVqHx0MGAvaZ5lndfEPN(%Ubc5|c%{D>R zAZ2V^+ti`g>;s3S^~Y`Vg4p&@0q%Y+R(En&C*Ra=@@&dqcOl;T#FfS@NofZO zjXs&L`rBV`+6Uhw#{QmxEGfC|IJ+UD+85kaefx1gEO9J0eotqtwVW>{n*A_C>&a8s z-$G7nhL%)8S<~{6_Yx|zN{F;q!8!*cU%a$F9zolqXa z$nS*RUs6%ZT{ME)bjqh)gT;-87Wl6>_)Rh$gh`u^K4h!u{TzD##shK=9pu7KEY5k` z)P%a)93O{zweQJEZ$2lPxk8lfAzIEu&pq2$ipo2ZrbD%Dpvm|-LMwR8Slm6PgTC#p632nxPn*zs3b`LX*|uPkqMtkLT>(FV5~EZt-Vb z#I%98HNrI=^*86Ycno^ht#H9uVYB3{@b*}Ok7%dn7FR=SMHJLSGE?e1m)bu|ERwtA z7UWDWo~aTXRC3hE;8c~VVa(tbqRwFExlnl@{QA^D_d^{!!%^=18wGf6^5wfQZPMT`VO6hjUOqgr7+%%?iGISILs^7_NCo9s#*NjmwwP$C(6tS+$lz%lpj{;3d?K)v$IclE) z7J8{+CK2MmCqpda8rTPBnA7RL>Mm0k5>-=q8n+ z1hhspcw8b(a!I~Ko&0{*HonfmpXO&T?BrfxDZ6{hMA>d52K-kdfJv=ClTLjK9p0j^ zo0VYSSKy0FFBgtUL^+V?;f#ZNZhi$cS+3scum8~lO*QF^G*-|TcH+KaL%U+O@|vqa zBVsEE z+48_8!z^+d^I^wmLlOvjqp=1OTGcr*NRP=>9WZejH`bNT6s?Xrz`WtbK=Ayw`w$EW8Zn*580}M z2`+kH99{xtd6}e zxHIn|Vt{E-PC;1H3>v1V$5#JHTwY$({#+=FqYmmlrqGD@E3j4?p25VeGb4Xq8?&xv zQPhq}dAETVN}N+1g99|;FXe~K^pxGm{ttcf(qMpazG@hX=Iu&UuCfc<6$S6fmo+(` zUR{ifxgXac;Q7iT;n!C3>_D0ApC7^FH3TG`(^_T++w72W+v^BGR%2jJL_7T+?>v3i zR8eQ0r_pC45$o~Csvq&lEP$fV4VPd;qGH3sPpmBAtn~r3m`7-tNKG;L<=I)jS7^JD ziAjqxz4EGs zo>-clmfxoAI)F&8hPS(%@mC!6q5o=}HPM6Qm$0$HmY6(ZyA9Ao7C1fY0jjR*E2lAG%aLc(e8br!l+T3zywa4v$BSym}QKkUt%?c*R z%?*kn7At{z5mRsAA~t%koXam0Ogf)BNcg_w51Xnq>yWK)QeK{A^}tN=CCI;C(BkV0 zo=xiyub1L(hI|nZCt^i~+}H$%N*6A|ynB$YWNpJ1AvwV({F@WKg4M`++09~OQNi!c zm7V&XCqkzs?^RdzPWkDfjVUs9LOp6X0iTB?)&-%KXBH0nl!sIO(<&yR&K^TP#9x|gqR{-*Hjg5b+}lGOumi$u!k|bh2sQzY&GQxqzGic# zRCt5vgZWgOJ5-n~*!I^E)Sm4AKVgsJsw+(td}H{Ig$*sn&+8F8#u&|$sCiDL|ET-8 zZ{xODZhgE0%$Fo{D{3P%A?E5{do2{jG*Nt0AKo!Sunl~Iey%r|xF{2E#dRfH!n_ zWzvq)w~-x=s_Wd{C+sV-^y53xo1jNkVw={iIazv2vK-U`|L!n?3TQqu3I2b? z$CosuW`!?Qw8HXz+}oGigy$;qud|AU4 zd#()lE#(7|H|FhuiJjeZF&m;ZJh+1olk^&RCE8(XUt>dJThq_{>A*RX4MO$Ou0U7Tjy3F#d&wDM76}+gQz~h1KmiLrByH-5lmW3 zB<}xAixUep0u(RU1lb_Exy#6FCRm7D8ky*5mxzk)Bp)_400dD)eJBgylP$)I7i!cu z{Zk#Ig}+xIJIP#Xc<`1sJ@VHqR6hlE;q%dW(*sOrwBvYqzI%%l4=wt zZ^W8&-hentvPK&fRWvf?@&}5Iss0)_fgKmX3Gj6F0l|dMPjAwsubQtuAG0DJ8?p># zCb>uRIUo&R?&yW~;mNbP7-)+_r+@P7+5%^2;+Jss0&F?ECAj-vNywVFXGPnK2kq=1 zOK}9h)4Cd*(X4_QV(S|$#G%>J!95K>wSOTnZL>ouWCj=G@PBHP^4V=QsNk<4I;XL| z3YKN}Br{KUdS=Stw~9k9&h9M5LB-&*O<+8$GR`hty;3!!pt-@#=Aq#m!F5^eBa@d2 z*q=3HA4d&z9qa^Wy7p0~x+fa*y?Z0$l@0+GHmlxT*g53s(Z9n-4hOjk8|9K2i5#w8 zeadai=)IOGTdz6dq}gR%)0+F8n`i zV)%)Vcrs2}l2W6zkV`Er1vVc99zAX0WCjNOHrnlY4i9wcVM+m9`C~|KQ@1@BuYJ=( zcYZZ*%7%K@d~a{JlX(xb`46*p_KR)bgwEXa!);ujz{R;~XtyT#YWsH1-Y&ozshSMP z_5Vc;{>^qfhu<4))h)k`47ka}G-KfPZFT{;*xl8jI9E(|krT3dd=)t+a8Uz(JH2sz zeGGb2mJa~Fmm}I)ISplK_2Hm*RDFw4b|!G2FMWm<&O_V57j2i2U({VyzP%So}lv>N@;AOKg_GmPu!pZ+S;? zpSf5el$PEi(lRrNYCg{s$7qypyUglBGYJ6Ryr?V6JkD?_mDAjstO8l5& z_^6juNh^5BD@FZCpAyLcQ+a|3vy1SLuGfCMJ9zS0i7EQ7&yULT_{OYF`JIIz6<&7r z(K5phbx)RBak7=PKmnmEy*TI!A9hS)Dy?nepX@GOzIuD9DvWX9o9A>PzwKZRUZsH& z^UYz>K1>d)VV-VM$q8X=6)m*^omGU~e4}#Tc$81xrUTu zKdP&T>=0rbhfT&NEoaTh3#3VAu6T3j^Gz$dKL2)2cUAQxow81|4O;1UGDbV(wio?I z!)>#|LmDiQupt`qa&>%Mpwmgwzlv5rt|a7Ide%53{V47H+XOPuOb}iJdD+MKg&khu zH{>1qIN#mScX)Wzci$C0IiqcoSW=ol!oT&L^R{m)UjA$r#=GU`5~|N=HGg&5v1FaP zuEq=Bg6XqlisM}4#;a(M1UK!Ig0xCqm32DXQxU^-%S@T6>Ey9~sZmhEwe26Nv<>ls zG$rR*r=|Zn-?_U??KI5wPA_1U;R4trN)um|lIi&>FEHhU#o223SzExEyg^|MDemh4 zlMlseeKb0eaO^=q*LTl`Mx*Dn8QEG3y?>iS_WZG(=j~@(<8kQsvIu$J^6x7>LA#58 zRNtyXwrO{FTVS*Hi`S0rKY2T7c)Pyuhi94Z%?9+l3;9~ztS^i=Bk<~1H(Yo($a=yJ zcmdubNM7rKZgY4|TdjY2L*~`ASw(9S#$kLbnDP<5_`Ds|0*N*{AiGQ*;yA}6z}uOk z0$uojT=;I1nKu9J4hj`W_@6>m1a#NK;YyEaCru}eA1BNRhdy2`P zS-6ug)v7rFxUfXce_6U@1s>=XbIsi0E)i2OFacVOQa-cb+-wZbzvClBNPB%lTv?dr zvT{I_q@8@6hdVe8_mxXJ&@*Yl?Y zwj<_5*)5x~UoWN$*(6)hM&yHRYRl%Z9XM-e_1x=fC7F3Ha1n^(&_o5MhIY0Y$5a|B z^xxEb*ARkF6-+|=#%$Qfqc7kgnySMBo?Wtg?ck@dOMvoV(w~ws6|=TsPEQd<;n4Y- zgMM)A+zWOmZKGSR0-0R zAGy&XGv5DTE&x%X2}c!-&wrPkq*3_0uH5X$aT)v~{|4QVSLc~@Yi_Sle{PMl-E`)1 zo%aRJd~5!c_o=Y*>25+a=zu~d#Xh)VJxQ=!8TD9s*JZx^IrPh3x9-+G(>SAc`cr~jHbl+6rSJ0n7M}jV&xAo7n4{ElFAU?a6$|cnlJH=E% zjd8bfy4*j`!7KJPGVUf=eO*SpMJ7fZtP?rb47GWWcA; zLWTB*N$k=cavKo}u0b@m|6gR|_lxIh=x?gqppFBLtFa{51ne-*p|PSuh|$r~*83xc z_}2~rg0coyM|DIfB2oL37>Zi0Fjpa$6g!Vh(AnDAwE%Ct^nk=rs>Lc(&x5NlZx!r` zNRSJt*68_cOx86o{B3Az@~c?9kL>7B1vH-r`98^8>~_7OKb{fcb&-Hm@#O{ceQ6m*c+ zW%|E!-G$ctJm^DaW@bN62|8H{oWZG_rmDJSgkjh9Z<1FzI85#@KPj&tidbOb{}mcZ zU>(^*vRTI|Ad)PXBLzB6=*;A#1Uvsum84oWwy12Eomx_lgcmW9k3-%X?#RU>e<=7H zxa4s`+(cDc%GQLPYPke|+2Q!1*y8yumKAXCzRSGQh7$FkU#*a%0v08S-pq*x3$nM> zOwzdo3-Z3w*E~PyF!HX!7$kYRFrjp2Tz`Igv6^dkK{O|HhP6OCly}jg;ugKsmiNWl zY*~jlU&gSv{}v9r_cz2tSk0$=hiTcnw)t2Kq`)+$!>?vJePD1}9Gf9~w)SED3Pu=C zmmIW%=459C-NH!b+NMU~mUJ-AD$qb?qK*lsVm&vnke8JJ*v1&=Hc=K66b10UQ^tS! zQ9CxW|AdV>dS@-`SW*TdXM?-g+}7UU1mvUBwnL2KX*pqIVQRLsjkJr;nSUi%Hw2F0 z8}^<;9yi^xZj7U^2|Hg8^OTj9#V^G|2?GB)M@~v>nR}LCwL$j2Vq_ud$v19xkFw+A z``VTl0}kR{(HrHfi7S}Ts|JZN`>$6n={J7sjG?YrjpZ$|Bw>`2?61LP;eC;WjtKo@bb?o8H z@b=E$Xn*@Eq6t3J$`l~O^0(ZD#?7uZFOP9*cbwm=}N>quaPOQ;t zdbdcR`5Puy1JamG7!JSg4ky;8b=*#@O_IUjV_13}Qsip#eN%GX6KeG>o)>F5Dz=!1 zI;!^4?TH>$!sJFdi$sqI{++j*^h|>L9Xwpck-9R~3K%{UHNuNLtVB2GB+||Yf_%DT zkm2_U;cJc|*66G!5K~mop6{pL$x$+K8Xe|-YSO-8pA|Us6N&8HS%s)C%fqAYV~%*c zS#mAMo4GDt?xsn>!Zz&;_zw%S6);~!lAb~UMjs`H4S0-vMP=fkTKmPYFlt>lWiF$) zdm$@4B`$){u&tSXX~)MxWr5v4ymHHUk3RhW8cS8PC`w)}?7wWahQ+XdYS>mUa(Vkb z9~Y(dX^dCa-#qIJa72jJN)<`K)w;jgue`(?p zdE6%jd-IaHyFnvt;izQ6tMRCJ!3=&jwhN0uWznO$4IoDTZ1}4WF8{HA?fx1Nakei5 zOTTj|;0o(v!$V3ooKOv@6r%Ej%j;N6mB)h0KXunvPnyAt=tfm@m6aB}_0hwG?hK>@ z9AbS8k!7?{vS-v|gjm>DsNe2%$GmHlUNZB?s0PoPtE##ZZqgjO;IwohsXBS#_d3|_$@BCCR2buS9hiAO9UOM*<)_x#mxP)~)l#oy z3=<*{C7lrJdoVTswo+9NrXHLAkfIM;`YiZSPaJczy~bE8Nrz5J8lcuDP- zyz5weT>PODAvv!&VN;1PzK*sT)48S^5(*72bqYm4BAc|^a0EB?zqLyYwVWCH5^B_! zaLt+{G8ujUz3g*`ap%Meym7tTmYz6yv!lQkmZqtk4?Ftx2=|?KHr8bM%YL=r(~|Yz zHG$reRbk>o1MYd+gK*_Fez{}Sd(RSN+RwjMZ#5xvYLCbzQ~mc!$jBD)U#gBD`k(75 z6wChBmKM8lOSQaZB6e4ng47H&p$uLWGnehW4Hhk4O+aUVDgRZ5-jh2GI#e!6R5hWt z-Ey?4mHuHx>^qa%k0bG{EbbtJ#O{F@`Rl){gk|SRd%DBK7XtRa$v&5b-!i^);2L&+ zI4_4d{N-lgHtaN1?tVazMhN09;2>Eq{n7ro>)FdJqwT|?$pgawZt)(bL)n3HeUuB% zyU5!m5fDrvD!{0@4Z!OZyNXa($5G|Qe!eJL2ZbD0>H2*n8gG6x!+Az{%vqd7Z8$7nZ+AGxks4=Sn8RNKkF$j+mxiJ(RR$Dza+vxV(s1Mrl zOs8l{k^c7iA1&Yb#n33gU|uMcY%0*Hz*5%Gj{@EXo>H0Gvs@AC7J__#?!`$T4Z0gl zZ5n;=y7z#3Pz5TX+qVy#0su+Vca<&7?e0)#%a>U;gZ!`F0zO_&ApxXe06=;XhYBPO zkc0ZlYCtn`!hbu<$M+ga|0Ji_1NajqLESnQ6-tEVc7GhV$>``eMoA$G#R)WjXyQNu zPE>y$P!I%+jt|oh##iZ?8nR@j+0~jaNCfWa6bc^!P<#t!%J8|)W6)`n_oJT|%HtFz zH>%Q{%4|!ZI-RD!m$smPk;zz7Su2ioQP!e=AjS3yl6Yc7i3MpgnfKD879#!=4dqXy zB57s;WUbhfpK7D@GmZwFeKj*xnkXGuFW?~c3-ZHY$BB_#sWQ@=`o7@yRwqf6)oUE) z=4mZgvm&)RzK$HnU)R;|OFE1V!DKIl%|64;8#nPh>kTZo^q(=FA=i^qoBu4{;8=o$ z4n5wL3-9vUI;}vJ!vrXYph<7dTuHXn|aT1Z{jP-qtlDz50ZDdVKoi%08cE?X8>(b+)M8FA2MmN3XE?)1@2+ryOc9 z)a>dz>+tg&U zTuUTd__?2#Q?(*aauFIW1GN=gql3UZ0zv?Z>`M z4|D6(vxxNF^8WE?y;b16{|jn;IQNz^%l^`jv7Qc03a0&jsJQ|GXwWiXmgqt!VkzF@ z?>R;>jD64$$JFil+=K_uHHNz^`eMsnJ_&ad50YFUX5-qZT9_C#9<6P|0uSe-zz{lC z{xiP3G59}X_rkfrT{2?1Ctj?}E^zhgF0j#g_}VVe|8zAYn>u2HcpZf66Yi4o925xq z99Bl5ks25VO?vmH8RWWFWH<@d+#O7>Zy4mt7Acez;W7{`v7E?-pAIY!-RPia*h@op z@c|nXMA0~o^gGZuB1}RiQ^SR6N6NRKhq|ghESDLM7`l68IxTDv-^L z(Tc8jz%US>xHtH|<|fLEQOc*o zT{{S{ap@$`JfvY=uMrRO0ikI>p%l6b5yitO3+Nk=5HM<9xaK;Jo3S zAG|t5R0-E}h#Sk-96Z0a zd8iALpUyq@j5XSj3P$9S-rAA{iti8+V{PwtHmZFNr^w?|jUt3`!CAbVf&7%a(DO;J z9vis=d1~;nOchtWphKmcgE_8bSR1j|(0iEH_>U^E9`SATST???=e@Asrom3E_T@S* z5vbw5C>+DYKV}d*d~>{6_p9Iv5BmI3ho9&0hu2@10=0PcRAl|Pb8Xy0YMkiU`q8#+ z+WE#|zeOMLEXBHTQCp^~uASbMO-Rno>QBnhVYj;xm>qtu!Bg9p zWdjFy`X79dYpT-DX&66{aCU%c>Lj&x`cO}AO;%vvaM`(naCL)H?r^2G!cI{CxjpRu ze`Xgo6w&U#XH+4M@s6wGKM|W8iKJJEfIM>7G?&L4`PSpp=LFy&7sP6zZ;BW4?RT{; z-UzR-?-KHT;{Iyw*~>Pr>9wp$yYmf`)`~dc_Cpsz&`>Z6F{CQ4m#(qz*NcYhJl|Un zBZ+m;XUVTf-rVCosl*+n>D?X>Vg&=`Viq(3w}S!VfHZzUm!u%|*T;B zQAGgPKInF2m-+{&y2vQiJ(lUg9*o^A=qo71OE6-$#6sZX#;O6}rutPs%G+_1;{{h& z+Ui3wOFbW@4^#uLB@uUkkGt0CUF+mcr#3fue7PBS{a0cOeNrudeAsT8=X1jhqQO_G z-(M~g-bjA|7$ofa#p*qnT{~tXkC-+63k0G zXU(D+)e;+Lj${tCXApOSsPY{Z9h}5;$YwlzL|%ld{n>pldl!DcM3^gB?U^M}R}K8` z^P-?0{ieD0m-W~E^+U2-4vD=#t68`2V=w+9ZI z6B9FS~qbS`r4v#EIx)@8!PF)7QfSrB-M6<}6eS zXlrTa&t*1TZM5p_-RUQ%pTKu~gKgk8f{J0E=x?Rne4TOb%$J$C7qPv&9qA*U{{S91 zo-J*jvtT^gz|<&l%op;lUE1%VZqW3}{7NTrxub0Nkfm;9MYVbh)7wyF#{ zr*;?GJ~u{iX{(H_d!FGt+ZPgx+;jK%Yv)n0=%Ca2uqWC3A!oiVob{?XKu z0ZQW(g25sE?Sgv4*MV6M9n{T1r^$qs0$BT*G&N-e|Hw@{s`9Q?PGp6Zv)RkXnmmSLqb{U-~{G)4m-52D2W)fX)Un_Msw9UTpPowzuBr;qyx? zis2|+255|iO?Tq)IAowM>Go0SE>!2naAekimVNDKN6c>~1k^FTi*69>O|8wKw?z+@ zFa_<=05lmt0UG!tIlHOvfly{meX;wc(2*Cm9_I&nP0%R+>0qE2sy} zM7us7)j7x|z%f}k{7%zgB6j@MUa?X~*L7s0wLKhZc*kt(?PyYt5-5&s_O@A{*-|?? zx+sN=^LvwncC6(Hd*dO&4n<-`Np~=%75;NgRTUf!ut98Z+^E_5Yn>iZe5(f>nTdG#KI5{FipJ7bv~4u$ zhu@#m;WiPZVMo&LD#}x9%KZ41trn}C0K6e0Pw#t_81gLJ{aF(-0rUJU+Ii*uthk`M z=RJ1gQych1MW5sVHZSg~gAjS+d*@lB$`C(pI>HvMm1TJdK{ySm>=Mt463BYisSmB~ zH2X63<~aRo<5mB<%&ct3haAm}!Q-TZ#PpyrTSSIHil@GT^&tJ#H;>KI%y|z}NQQR4D+`yBbX$Livnc0{Vi}&yd^=hpy*tFs*+8}AW@wv) zu?Os;D_56mTzHB7B`TX{!Gy$w(0s_t$jrk%N|#obdo?8P&2ny~HnI{E%S&G4i3&)p zG2-Q`wGrW2ZOT4-eFeMW!Z#=o$Sh?2n}fec8k!vNN#K8Ju{#F-$3H!GokGmReZeHq z*HF@M&f)Zf0+exy;OXzCj-!6L?yzTO*;ei4Mz`R}rOHqcEc>#w{Ic#Ms zW&|b2;0xN&(_no%dP&}=2T!5GW;`5r{H{25(|)lZC|14Oa>8#n zE&*u)R5bwK=?a>f-PMOE{z*tRJp>l3!3r1xKIDI_QI5aLD)d0e%m{U7l5JGRp5`7^ zoCSf0OzR6;dR_*hrUA$M07L>=eQ8EDQDcvQH)oSo!@o)EqY_ZSkt z&o>7C^GJJ4_J%v^#v))soIz>((Y)lBcVW6k(Ob_FHLBHX`WbVwGfmq89>goHVA;>+ zDDK-^#UTKva97lw>;|f7BWGXh`6?tBRj!Ef+wallR!mKtx7#Z9H+)vgPkbxL2mIvA zK?UkQe;@!@{K%^*YA@J@05L9Z&i&!JDEo{k!2n)(cnfL@caN9n zMBaM*9ASNuWv*(OWmeB~G@956HrOcih*PNp!tZA`?Ob+PKX*pj`9r5DW2hV=+hPGZt!-4j~DofI|-l*5UH{q-At58jgZTq)j?<_1<>ImM8SpV&jrkh##4oQvg?LH7@Z~3|A~r(JitNFag6vv+ z=!0v>qD4ucJ7tq3n3ac^noo|a3e8#(g+)KI{PAT_&}-}qO*p!ckqy(f@;9)_7Smd(QXYo@Qqn~i&qVu< z+{r@k*75&;sFDASW%%MjK!O>YJw?6s;>z??2jPfHsOueobp=wICAGj(!emOZ-G;xB00;;RrHM2$AZ$G-V%LXS7+u4ts@P@=c zPdWdnv}F)zM<`XpdxV;t7P0Z9uO?U@(Fxv0S6kO^s_aiM)0okj_Rqca2-8YC0tE!z^-|H=xl1Kv_XKR=_e+Uljo zO-+4NzM7i%w)8vq7$WKXz=|8yF_*~BZW#=W+oml&R0R=rtjZ9eQ|x|>F>vEczp~t@ z{H(79t^Y6QY6CTH>j8%-2DLs$B1+IB16Lfz2jK;a7JWxepC=gsUY#lio$%MfA13yR zMqeUc0mUAoHsVsY`X2$LJHB{1>EDch|$Jd{hY^KOJa@r-#c#q zm1$&CVm!ec99_0n%va}aczJIns&}qsLW*L`Ja^{#BZuuuHYBz#`oGHFs34>Fi?p6; zZvC;O2duq`vE*;&bj_}fVwL8((GAP>*%I{AWbKtF{YxYE2-tdF-ltM3a!Bl_?=c9) z_J&O3ONB{Rcv&u4nAYb2Ltk>BVU5}ON7YCgho}W@HBtWTy~~{t*Ljo8db@^osQ!NT zURRiL#Pz{@#P<*QN3xo<6Z10`57V4F4hOZHXPnEP6lbB|0xJA0Rq6=;# zO8-{k&Blt3v+rL|g0>HSXp1)nFxI5F1I7~ryBnk~uIE%MdLOFH4*JN3&dJV;S6NpD zlTZp=q`6nCJ|?%rf4|v##ozD{j*3)2&?V$n2c}Oy!WPMWJ?;}rr#J86#crPhH?J1l z9OQe&_S6uW%k@0t`Q*y@dVIX?Y0Vm5no!^@mJBUWo=4h6*}clUI~{UPCN9#MI3 zasa<%z1KNM0vUb`7EtCoXGu_+-Srr-{_JX_=)_7 zPR+Hto$$oE(ZfpVc+LkqX$i;E*Hj}BZFGEhIUy-535kyeuCg+?9F zAK*E%tr;waD=O>~+eEbjU|r%AOpo>(5x^ZMK)T&Gu`b*OOPaVEiXTlMjenK{icI*- zrd||ESCc?l#hYH^)#uWCs0zjg9bp5}ES^e#IDm6P=m$D{FMfDZ`Qcc*{IQ4n_{fO| zO4B!j4LwY!Q1<{C^em`gRA>ldQ6h0aLD_6^%;8^^w^(2h7SaOv1srFMt!Fu<`TGbE z+6ky&umIfbOcO|E;4QKyU#bN%r1)~&AsF?<*NP34&Bn(M^a^Y`N@@u?W)=7I9K{sB zNO+X&6)nS{!NWe>ImuaMOnB%J8mYYZxC|~cd+8LN7GamFbXpe6KL?zHE}dE%v(F ztaz&|{2^zK&V)CU$i4}2Gclp?^pWBmv*Ux=r~SfmS+3rKvb}sslswpm*VSoN9c#<% zSU< zHZ4uFgl2Uf7~^)PH_~`Xt>G!iK=C<`@R*HcVI<&y?~_TrD8ENzVot|SZA5VVJ_G}< z1Anaxb4n)^Vg`9{UV85$6qymKMCADvo1u~YFtIKu{j|B%1rq$+b7gxV$lvq#LHh6> z%m0#L|9^%+*qyc}#B@!*3gtNBqbRr#h8jw2OaOxj9OWo{RvkvJW{w7AQ=AEu&o}@n zw(}%bD;Z8tJ)PVu=oT{b@@W6(`I0axC@>M)pG=`jn^!#A2nn<;MA6k^*Fx*Hr~)W9_0FyoN)G@Al$B)xIkq^0Igvh|3>2nP05 zSMq+6L|uX+SK?2_2**n)|E%t3i6+l*#Wk(4KB7Qhj2#lM>WQhxbp8H~x(16tV66R9 zY(XO0v02wS)c?vJwf$UdeqF1@W+%K-ZU}k-2#n1GC8b$D|?ki&6 zm&7qmFvtMPa8&hT?*THvf4Oo1J6smcAEl4Bn?QQ+9b^jiA7M8-ev}SXKl9wZ1Onr1 zY;LUz%GjePw5dV{;G4n+Ktx!f%0`TS7j>e{<=#X+eqYaq1#3^2wx&xqw-0bkzv`U) z6mzq|?Bl`@;QIYnj_Dq{fUZ;q_4I}I<DQ+s*go%FM(yl$wYx;JOqNLS?n zmqP>C8FfC0;Z6HAo^Z^%Il%x4xo@Q>gL^%ZZ%ePpuaZ7sBEq%IoOJ&O8@|+JpGkeu zk>fynoe(jr>B_bL(HEkc5n$+4!2moi#u;P92sMc^MB5(^MSOZg(*#KUQo#Vm6`9{#-6z=9vfhQ+Fr&5o4GteW4f~4}!qo-~vO`;~*sRiSp2vr~B%=koB@^5PHn z(1LWW7YJ*UA5*k2jVVjC+aTN6_7_X%(1Rh7`$4l~6WUH*69=i#TP**rsww_&Rn30^ zFgreYkI%KvCL`2bZ+a^4pig0~b3yAW2xsRW>gnUo3o?PYT^&q0y5XNyx;pmaspPw> z>1#SqvpY|<4Zs=7d!-kWTJ~(@yA99umv1Ig97W+8z8WD$)nZ%jZ)iXsN0hNHzOFcd z@a!OXK#X!+)77eMo!H~{(XNsaAIz-M+CAidMv zo$0>+Y@cn*3#7MRe6%8N(aEa|HtDA>n zo0cCyM_W7KG*-PJ<06xF#u2^I?nIp$ErOZ=DQD4hd<1bP(>7myQK(F&{R{*{t}`x7 zr$k?;1>Wrgr*Hqm0v-pZzPyq?d-v;WRyLG~VtyYRF67cbz1HVcrgR&H{2nfD;*Puq zzF;umC9B)?`&D10`Ae!^<`ZDWp$-ukDrOD%(|B2}&(pW;0|O9s6ZNE%e=>g&HIC-J zPi5Guy25Y-nlO5T|Gt3Q8)8X=0yl-@V_&`4GGDOR2){N(f$sS)SK{5kBRMjV= zW8a4axj5o#k_Nq7z#f`a0yXD_w!``5XIxy4yFXo+gVT zS>Keo=lzAMcP1WMxy6Yt=O4KEYsvim!ulyr`XECA0I`?JZ^G-Tr~Ont%r4#YBG$sr z?M-StO9mqEEV-u)v2Eg${2)CW*7WyM0uQZJ9i`aY8T8lMOMMS}@LOCh(IW@SUGiHT zMX zVXkqq(p2jKx4AyOM9g|Uv8d%P49R5nmRP64^S^*kDui4)%+d6)&OHYJXgxqtB9a+jOmb*QL2jCThvs+GuymEQSef?z329md@) zF(OPHeSfS?=dh&ku~F0F&52C&_261z$0r^~NDv917{`C`PT{Q=Us|y{FL}ZtVREhl z>h(+w$(V0QA$@ujs7`epKIlD`Ba5}fx_3hb8{I~hg~@9zhn8Wh+w|nI%sw$aS&x6p zj|AIIa)_GzvoG_Uc-K>1>;l|G72P<-6pm%K{yn347Vi)4iGH@wKbUQ#eGgO5AEa9= zxwtYTMyOo*$^&@F5>=Gt;<~ah+t1u#|178PLF_! z_J-v~tu=^XT38R0EIzGi!4p~)Tx1*CGi^fQ5sk0y+Aav#$TSIJ1lMzd0$Z0Git)AU zRfv)y)v95|mv*hIf*JL&j?S8#?p+F2w;7w!)Eid21hA^V*zy-TomyBBI6Z~zhn?HE z9@aDPCUn-%pM6X^LP0gZBvOhmqkjFb6P*zD)tZj!c9nzz|=AI9ce(kb4 zqaAnysYbYJ9@Ca7(@O)XBR(K-!=Ql7=xgSx_Ll**)?Lx^|Jo3*QZs)9H`9OSM*IEQ z>AM1u&&FPsgh+{xI_?|Ti^DS+{{c6^v^bC>s>sFvQWt}A8moq>dKzX|s|7f!DRjM) zN(oB$OQ8kq!#51h1_MXkOg&iVg%znUao{!W^aNoD3Bl3Js5@4F7g2EjF^N{AxY2an zN5ihR0UTWs=rtr9@V1uj_2rrvslGQt>aN0Iv(?f3Lm_ONa^iV^9xK1qct$j92m)Lc z1X-B)M5JO{I%kg;B8wF|-fS^q*Y5;M10Jq2sur_6_@Vvw5DNn>$2F6pjK;5y!^oTg zuO{MgKcZqBV-U1tsiwdcwE>NR+n9Hz-&jI4WF0koxaxkGIh1R`WgF4kkB9QV_v^VgKgdYm6x9aRl+*vw;K zI{GO>oO~p(!HcjSaW-4<{0hXegnlh?}Q6WZ4ow8e>B3`p38=bP+H^W^+ zki(;N^a7iv{2X27iTpz3F2?2IO1D||-%5}0WpsEJ7S^mp zvEF>CJJ){rG$L%-lGvG|@cC2%yQ!pIj?}W=$dEdmc|_a^971};?y|5V(He10 zN2R$jQo}5VE<5=!f{fgJQ?ASS;L&PxWvzA;xlnQF>bPO_FUuLazk2oWtHY|EHoU=X zTs}wr`KAlg(ytMA_6S=DwjM0H@I*lFv#dJED0O=))WautH> zgWvsZGDG*m1;c-K#tEDXdn=b`-;}_orP^E(q*Zm46?2-}_C)LKPSb)HMx|(b>tpc9 zf8f6c{A5z>~@vr+e;+mmmfXL^se)i)Pr2pKn!nyi}(kz_|y(kgf!UwM=2kSmE*E3v0Ye z=QMSgTe|$#2m0#C!Q4aV6YX$?8y>G2t-mA}Cu^hFu2Lp^QcdrR(H`$Q2Mk0YKf%q0 z{zlb=B;|sUzJt2nBgmI%Mg!lembRJSg0Ie}4<2EIKYGk^%UpgvBx1D?dEks}-BNmD zsQH5v6)C@E_e==Y?R<($c~;;qYXGNyL~Y6^E&8X4>-J5^6Toffe^h_MPozinQ!~^I z78&kzu1L;f&&p>@**C6VNAt==%bG;fgl~@Ge z6DWnE8F9!cwkb#l_+IT+S2L6Z*U^Fd-wq{wO_rjMF0pw;?soQNFQZ8kezDOWXVI(v zBoF|PrcSv&@JidN>AN~Vb^;oqH~IH+0&Z99LU;3q<;V8~?g%tL8Vp$50EN_L-75;u zaPS+)nAw1ev^8t*pz97}+72HoPVAOE98rG+m)sCepj{VbmQP9Uxm%0&$Tm0>3Y}VrM1#`0r#2$ufcMNZl=Vhj+LKzgT63m9lxDK>%?wJR7TKZ)qU?28R-{&_R%`el zR7JCdxW9nH-=BRWoVwM9ec7ChtN>k{ruG-}d|nax}ft=Z$o~`Ag?AC17%GWDqyQ8%CSHDxeXF=P%@6~xb+3?ncKfKguM~7a{ zTZQ%Spv~IlT%P5_lxBP}dfdqyO=1or*<9nub)%Ds-FOx)vnG1fPW`~?zzJ5+_`3;@ zn<`#s)8-oF=g*Pcvy2TiM(mIRHk;R7of(`suIffUwp%&*E*<3Qc|ZUt^B&-qXBcK0 zGy*Bj#)E^oNQ?i&gp);Wk@v`XShXPs`Lhx~Ft}FlBh|hN0D1hz$Srje;!oA0aE}Y{##IX*G=lZ1Y6WMsYPBwPFB=I1|?sUf% z+SK%@ef}JIWHQU**<73>t1t5*^c9voyF@ji+5cxWHj{dkn^`M zUjD4W7iW9Ax)6w8oZ;iYr9wN~U(Cc5?l-P4ShJjwUlRD`n^a!(8sMkKFT5(??rI$e z9dfT;UnhPh2pX#zUwmG!^0ZFxz=k&dOJ)^oG2RLOH-%?e47A5Ze4pNxaglWEyhjc6 z7dg-N+h;d_k$#RYgdW5bz7boofhjAa zS@I1Jq2xO9+Waxr9Ro$gHVWvy;Fl6qSj9q{7Re#VY_1{q&xOTCcTdtIri6VSf;s4WKY!D4S3@AjPShfxHg#@a8x(xdIf+o~nE@ z^IH=B`%%`R&{l<4bmy~|>FU3e`&Q95Gjtxqb*%Q=Q&)hTPfc!jthpu+lEN!}Bd0#O z^$$IP1=Z?9PwBnN^cQzldC&4O>vK(70StT|V=sTDp5qRJ4?cO|T0P_YrT0%(f`vLQ zqD13CmuLlUTz>I~NjWcTu~s23Z5`1HWMg9iX`ybFFkAsv9n)(ApMbl;gP^6DC)4GN zR_~Ug*}~Z(oYhM*?!TP|O@lsZ3Q%)%#HjO1e)(*aG-jEkgHp;czh-~+kB%z9yBZhC zNMCbl^R=D27;4y&)!>ukpxq3Ro5~P)e~ivm_AkmB-|wp(sunAx99g ztt4|xL{l7rUXK}bq#%H>0*yF&L-91xTzMgNWDH?Js*cR-wn(q`2Wc&VZJN#f~oj@=r#fWSZ z%u6t$Dc{)X*|5Km&tDt+8U8MXLmvI|*AY`#s=``m^9S{t{16}(VLLE)(F&Zljb_O2 z0&6b|#P`(vnwh`gD*F(`jApJpN)zbXEP3^iU7z^(R4dYn-Ue3JFGVt1eO`8x$WfUV zeLKWyoR8g3j<_JKbff(GF@$jZ-~v1{lWnp-6qcA@{mX`GGa~ZzHM|Hj24|nmNBC+2 zl31kOg-oW*3Eu~iA9sp}+=K|qO_Q)4r8#Tmrhl8Ro=#F)=Yawhs!;Cd3!E|Z666oK z=t@>wNV?&UKQFE`)I>CAJ8L_>`M%Ym(rZTeDc|e+KHm&-mVIWQg$7iWh6>fmBvypY zOvTm@$&-xgtV55v-tKh{yfD!S=w4#lKjMSj@W`MRy8Jf~Ft&Xiswb_D;aWrMS66BW ziLBB=)uj*<3U)8fR=jBco{vPnV z`5NE<&^3q@x(3abOWyQI%UPBGX0v$wK!}+mrF34QPf@!SR%?XmEFV@{Uz0nU&c?GG zFJ_6_ffg+1_frTYm}Mgt(_TN^x$&29R@a1OsaEXu<5?#OoFRgbyJ53;UF;^LRFA6~ zgZo?YlkU)sQ}KG5rjFm|9%O2R>Bd=kH<~qKp-)_`|vlgWb1Q3GKhO z6;A_52CBCx>`Bj-ZTM{Gt@qDgeNd{Vuy@J{uLc+S*zChXFFs6oE*#mBRxjVg4qL*1 zOEnY58rS1lW@TB{a<$Kyti!Mi=VNdE2UicUXV_0zpNoAGTesiWv*e23?K2BA$SI&( ziuc&sDt-Yra*hAyJVlVT>+ZujHz)A8sm7MHWQ%|8?&-Nm=3}5>^i4c7cI;+7J60q8 z*OqkXB)gR#P%34FaMv_-o=Vq<(ylUxJtcEdzW<1_na;!AL?<@6ao8L1@BP$0!L8Gr zHk|eABrsYx1vy!_zC(6Q1H!TxZVP?WbLnJD*X0E2DrWx)7GCI}PF_W$?Xueh83y?e zMD;q(HjMWCMyzq#!5YusP-C~$j`i2$70hh1<*ze+8!`~IqD@vik*qje|3h9=&So_4 z{aBEqxd4l!5Wu0~Y?o0w4 zXqS~v+dxAgQky~I?F;4^8mmJ8`3_=X2<)<%$@)$qnce%F-?3=9XwsbSq*UerCzK^&UlpwcPIbPeW_wbnR!WZs1@>V4O z!qa-wZmCpe8sD6MhSo2OP#f?J%kt5d?AKk_P!!daP-OxBYy)e)L$)uGY&uV_T>Pmx z6a?wX-B>JoRBb(#fu-OiRmWTo&6t(&E(6a!lQa50P5)K+aWXDXS&7&DQWbfZEIs9g ztqSq*j=bXJ2J`uGfWgZ)wX_e(=V^s(UdI-4JctV{C4r{y5PWULG>fAeGkpkY$Z(St z7NUf0{c^{bxwK&J)yc#-HlJo}h4)0%1e4j!I)9_@e!t?p*N*HK74iq17!SqeA*LhA za~!UMg2(QUj@+UMhWGnD;lK8k+z8@6)|4Gsh^vz5L}jqfJeNW`6kPFDFxm5)rQAvG zEi47%soH`x>U(vPeC|Mpp`Bz3FL8e#TB>~7tSV6*7`1zt?ZP4GyeF%<#8UTSCGctZ zS8RdzOvyNgHP_(Aa<$5qg6* zkLsCc)w{~m#v2Z==Gs*7YU!Un4~zgq2zSoTNq-DK2h@l2{42RP;`lK7)0bI}#E!-D z%@%2h_uO7dlX(IQB!#%!xW1mq@V>$e*-qZewGKK@VzU=SES@4}mUo*3?e2IA!^(#-trI93f<`=xa1Dk!n+dgjxzvm^iyNs`{H!(pyT@1$m9Msa* z`a1t|7t29Coj0Y{S1bNuE+M;y)H1wV5BGesabWcYiWm&tSHpG$_Y&sowpl1&>|M{W z>0F&p8Zi;lK@F>{F8P1IX+Qx;V7z*zz8+Crxdl^{hizzM{a|wAzqb*+e;w#+IHcU< z$%k0P0#CWmJOcmMMfFtGUI#^aAI>Al#3TIadY(LxU~+M2a(;=D+QIvW!e(hglDFY% zD`F>ksQ~NRlVFO%J6V?lZor3c@SaJ*_xIK*d(S_QzC~Yk)lQ&az+Tqfs^{x$Hug(u zl2elTjb3MB>gskPMWdQMuwXwk(ZOM#%xdqB$y2*4WM;iBdaThgy+nxh4Ru3!&) z1@{?2ajsGY?EwcP?0UN_VkmV*_`m=c1k$#3InkO?4nT!U3)nz;ZIv!wJgdMuU(Y{|U1DI`KREm682=6t25u(?(Ii>m60ir=b1SDF zaL*tLb))Nsx{Q4$G2us2f>3%5*GEb`EGs>#hy|d#2|NVeVUnyh*Sx}v_>!eWgxsj< zR=1SnJ-mhn%_)er^i#j_czI#55G-y+$9o)g<%PDvR5zOvuwN{x#dsw4MGcFEU{1mc z+TLf2S|rLBh`!(Hs~M`&`{^J-li}apy+5jecQpGmKBY~|P9N?^b^VpsP6AfX7UR)y z2o!u5uqnoOSI{t8&xAK zWx{i#?q6oBxjUvB*V=Q3%_WP4bB$KjRF!;NqI<3@am%O2aJib$9#VmISkiAX;HdA}dmOSXxcEYv!`gW~NUNCrGIH z#H#9ZA;0C7FJFh^etB^e&2y$CYR8mG`n!}l6CXRqB9hU&iq8{Isr!4A6)>>kzZ^Zo zgQ9pCG4ciC4eK|PottufQfqnD)t+#AlO2ZaRKeFVweMIUhvNeN0nDaeupXLm?$@;6 zz8_N;p9UR&cn!XPfrk~F_Yy_o6e6XN!)Gb>T%ENVy+|di@oUM-AYfI;i^?*o1F6WW zt-flpU`G!88+xhvvfbvg#p$h5$(g^Wuds>GYX^M* zi^WD~rJ);&1eK{yAGlN2?WDFL8oRiA17_<(5aO^`?yZpMA5b&ChN}gGn6z_t=ic8( z1L87Pr;6({G%s}`Wsmxo16>{%V7evq3@0ATjS1$tY&tB;*$WqOv;F!NSoTIP^UBdUr1r_k{k-Wyh2CN%E1WMc!x z099^SOG+(s*vcW4Y$hMiUW9I7g*CSdXrPTOzsW7+wY`j4gX2oC3aQS5oZklzE`}R} zM*;+F+Wx`HFYJ{Th>4Wlzbi?~i#PqeN=0^e^nk*>3A?AjPL_H#tA&TTFS=j2_xrX! z_YT~6ii4gWQcpib9MrvFY{QR+K*vT*I?uL&> zoqN>?Ql$ejB{+m%s&nOSWhaReDn^A*Hc#+!S!k#kZrx9n+kQ`pGofR%Kfcvbn&Ura zC9JSnL`Ax&rJlYj-xOun(yf~9H{gVCoC44F9JvfPcg(8^O^K*A7uvo+hs6R~R|!fK zugj1uCN5pQj*c51-bRU8Z|6COA!+vQK{)975|mj#6awiII1aTz+i3f1gjU)%wB3U5 zYX?93fB1UOa5m%j?>~uHwP}kQu{SY_+OtKiqNQrDYHPJtOC)BC8nI`M8dX)bsTR@N zt175HT6+^Dgm7Qq@BM%9`yI!9{2%5i$#s1`=lOoWUL*X#yN4!enQ3H&Zr@5u=5K?y zWU_sdqsKJG-c~x@zBR>$@j+R@5z5gc2ZQgO*`N#g`=a0QrhM8w*L^im_74I_Be_TedGwL^#EvaOHErLbY_k-y4O0dg_RZ@Hs;~x zm+g6&AcF%e;8&opT##Ef&_|qL&^}8cQ?HvrDS#~SAUcL&i?qkEv$Nz#Tt^_!MedYRHqom%Gl?l=eiyOef;2Z zYA)7QHc0q87qZAdOu=DE?qjA2(MTmW7y#Mrf|nsjST6_BN_=P0g6@-hYeA_Fygwjq zWGG(I{el*xAmR2MXM1-#aR&%6xHTlM$7Z zmWE7Xoy;#SUoTYE20#OUly-tme#3@osBDXV{oKO9o##>xlp9^<5oZA_wmpMYOtkise#05!lv|Y5`B`TtxEl02EmUQq2c?PxO%k7 z)`K&AvnSm_S2OVg{-4EpglVbO(_xQ6?W|*^j(|;>KHL3<4@&vHQVp@*-PacmZQOXh zjlUW=oaeiF+JEbr)yc%xpgp2bVaSawxx1m$8!joMOJcAw^Ilv2O)?kk%)y>FY$M5b zcq^yKREpn0=lSc!G5Na-0X{CDbv*m@YKITmG;%aEq&5;^uIOEUUgWyN?zPD`^Nc-X zZtCuPinwYz46s%!<^G3=19qMh`8`=OednT>SGym%@KPNngxigBQu)zGT%n)T+xp~x z28fzjcZaKH{Bnj9KC9)p*hWt3-5@;OD-}^Y`F`Fv`*=2nDo}t+*{!O|s=)#=InqXO z+9p6VLi}LvC^?}qEe2)6zU=KF>p#5%nW|_`FM{=DX_S zPNOj1o_vKSJKtk3uOG)v_2OT?*V&;C*dgAOkY;!U@C*s}mHu&4lvf`$j(0#Ad|&=d zt+aC#EAoM5CfnU%VYk`W%qCzaA0Ic4@v5>#&g+r@RBLV;KYzP=D=9jae+11Ly4#QM z&S{##R8EiXst3Kh=;CR=h`&(scA7b=&}g)Jy!$lMLAh!uTcv8QZmX$41$^iJRF&d_ zzvgtZK9ggniKkI0P-3l<2v;cg{oS~Z?(RP>nfPyzgtun>g6{Z@`=;V>?MjF zFQJqF@Fm3h47j$KkGw;SYveh%=$+2V8$}&0)E8nfMa?$`6U2=NvBaFma`W;+KbVgj zK6u#z+jPu_=|AkGkxWm^W@E7?Gd+D-s!uKCtW>{YmwZF#rTU~FWwZ_$XHlw9qS6BI zKG=Id=MJR0(fMnG(#{UM0C&|O+6DV?eqq*}!O z(AQnMQXRBPwg~A5rSpP$l53lo6&}HqOGcATnDxNa56RwD>S(9Yk~&a(f1_I0Wf?Pk zpwgmoYV(YCr%7C~lb~LTb~1A^XK=wY24~84k+a_n$;-&(Y6B9*S4d*&2i2+9+*F0` z1$+_YvShMiQCtd(9Mgub*9M4B{F?f@bhAPA;KuENx{>9~KGm&Esf03W9_&UcYIK1y zhn?Riu?iL4B7WJqR*xo?18H@5XfSXG`Aue^+lEu^zS|*mbnD+;qOs#GW7HU%Hr1*G3&I`~`Zo3=i^`CNu224{d;HT)O?Y^=N9}T|sWdu^H***hkM2+g4tuwBLmIMlxPl zK$aL%a8KE7Dt>`Leon6?E;Cgg_`5@XY0LDul_77lMq*arTIbcaQd8wW+|NsLOVUE0 zMtdX&t$Ua$Z&bvpPYt%XCH{?@9aY-o-o=knIGYz_l8Z&7L#mSLyI%(}Gi8vbf-om z>xiXca3I5YN@uY?@qhXt>)X&^Bvxlr}Mb3;D<6u4u(V2|-K^r-E zoUx)Yz@a|EoAw`+6)c!&Y_!*RY`n~Nfj0B%jFee!ZE#cp6akD*}HMCsCKplj5$o{|-f(G3zX{|^g;w>=+4+%N++ zt`C9ZR8gGNv!3%c7j;>H9mwct2y++%+Q4&vDj#`AcpSeK^h!?*S$T1=gl-%Ms{0_n z`Pwca%%93tkE8)x_s0PW-wN!TX9d_0sG7?O3O)=cb>lRX4aWy7743LBT#(KX1)kBm zWoTZut~+$vIHq!KNWqZDV9%#oP~u?!!%06`OcZpI~1|3!{FzQmQf)SvbEHog;_7qLV#WoP@vG#ROKg5)r(GEE6J_Df2AX|>a(yqo9 zuDAbb{~9R{QfQ}_b%N_=^n>1jFDZV6DTbB);K5Vt9tVQz)+z44pqG}w^=h*3e+(4W z!Nk-;-jN*{Cmt!kQ>l%2q09p5_C|w%tW%r5>)Wt=B3Wr z*036I2{iX3tG0VCl0!NUeL&XEf=Ic(|EZq-1GrbH?&fv&R9&s?t2%H;OZ;fn2^o@i zTGgKMT9P2uni$J(Q^dyi8MA@|i~&ojMx2A{ha*3$!+GmDt95Dp40@I;wW3h65-5`> zXp^fJp6oUzvjK9m~!^ZoRX$1^la*JP`D``;GzTd_U zei6Z&WPy*#NQ101@0AZYT>AIoX)Zq1P*HR7{a$)wTrWJAm|xu1kMPFA&hC2|nuZLK zH1S)#Cx1t`MH_qCcq2U4EHhBfR}O&y{W=%hID&(pfvHsj%JFC z4kMen%)e3B8n3bxtG4TRen;&KJhf~S=3=mry>%4sH$63k%so2|Odup0H+DsR@E?=+ zDJbVA@T|VgOj?pVlA|dFQ$bzN_fH(|XAnIehlaNj_CIGAA)|>7IWpl6prh0~pKL;>FGzjHI~Rv=uS2O56U5^U6=2+7D|{89tA^kI zzEgR|?P--4WcGc1+h+RBZHyPDdF7KCiNPo0atlA(A`_&%*B$B^`lz-Qc?MB<>M)0@ z#XC&zHZPqX9^exclP?n$lS8X_9B?MUQ|mDJ!o4nZ>=!#jqx(F`;%v^;vdNG>YY$ch zYu?YvoWa0nCcn6BEU_;kJ z()hf-kJQrEM-l+z4^9PpBxk2k$G>QHzKnKz!D2Z@!GU|Jto0VZ)Q}SH&(7&{D5C+q zc??KqGjDR*!i zcwq8k@C^)m;5Q+FHBUJVq%zCgD~Q(E6ikw^=1jGfcx^kMZ+rA{^n_0!YT_s--JbZ6 zV|G|G9_W}((uU^s``l9w0^%u7H<)REdU(y;QY-zoP2Pz0sfwky!8}eUFwA@nOt>sO z%uvq#=RSJI#WAt>RrYYZ}dN-TOcl z#az>jFL82`fWJjQ zlkI%hEZ;M*Q(Jfxlp&-uE9J|k}>E7qBNkTj&!_c?j=M%;yv74--IyV-xYRc^NEgKkJz?vT(ZZaY=~{Zppxe+%$|D_;jM5v80M|Yn zzDH?yf^ZLDDRIRC!6Co-RS;+1JtdGp7OoE4@$(NpVlEL6h@5mK7c!Rllvp>2-m&r3 zzwoIHwb|;t^OG2qS}`u^=Bc?;j4g|l*j^0ZxO~vSt8x=6{sxBF*YpXz(5tBEWrO-r z`eB`EzmnpCPOHHIR-^8twki6M711Dix zHH~JejRL3|^QLTQO=|{37&Gj!orY-wJ#4!sQoxkx=PJ= zm|@zc;^9w1DxT1^FeUYlZDDEnA`q~jtnEaW6Q)BylQQw$FEi@5gz)+~0YBY#Y7n98 z#8BG<^iCH?m5;kg3T2NSmiyb;nc8K~PV-jP(=yX#*dO)rOMD&>`uLoI1VSj6&)1M% zyUXe}1tX}fTgQow#|aws4z1^{ffrhxT|FBG0sUkoA*kjgCGDmvNPy(4m%v3&LQ9*Rk~y5w?c0E}NZHP(821N0%$k*euv#GiCu$(8f9N z6#ezp>603P_7>$Nc zl@3G9`dqv{Z$Y`gWcBe>{BPsetBvpSBlG&Tq7EpzA@OR4`UFMoIy|wdn7X$1`i)$s@7J@NM)o0n~^g@ zuD(u#R8zeJx!(U1m3;(y2GU9+zjv*jj1e;1GKTJjfIjpq1s7*hN@O#dDHUA<`Gslh zy(E(!^&xxI&iNFiS<0d66FpXJ+@2Tq(JS3J$xBEXG{UQ7)DQaOYEksKT72i~V%^+W zvgV_!?ULU)TSsQ(cFpt>FwRDkD37f50)vu zQ4)!(&JA*uHEetDNhCi=Kd9v{E#o3(T-H!ye+XP%+vGQUAy3aPw@QoBgD+*ZN$Y)% z!(nN(H0`LQ^+5gZ@h_(A+hVJ3R;8`_Z=2^(OKxLFN}{LTK1*Q9%sN_r-6D8|-LzBr zBl>q;#*I5^508z$L535td1{Lh;`FKr`G`vN+-d7=fL|`z97mr~s=Ma9!fJIBvqfC& zcbz0Qzfm9bAj1^2K{`*gYoBtuku8x?cQ?ctAI}`CSi9$L#D&~}g>Vh169?qiw`_tY z<1Pj_@*2mXvPhT2=b>XtJIs=9XAh)C9!!1+zI%9nPenekjqnM%%F1L_GRnFu*GAA< z{N|-EziJPo96!$LMfIwLY_8uTYG2L?uU=Oue+N~0Wnj(}H3@U3)%c|GtblYK=`-&0 z#W2QDFH**`o;MHC=vD9CJv>1UXqS$)hD%iAeDnB2ye17@1F{OpczY(D4UW@>JC>iKo+R+F_E& za~ZgC)Vb{YE^bF81|G^}zGk89@IB--Qi8;<+>rB_`I7)3fxIg(zv=`YxaTRK2Q9RCC-8SP)|u^7kZP=^c5Z9e8wbj%ryfr`~4_`Fn7vtjJo}Dj#u{~{z?&GJ1khlWi%)Tj*Y$d{3r}(^rl%V zOcA84sRCtlrFXlsOeR6|itGmOZR~<>B3qO*rDj_2WO;4k$7FlrN?RXA6SbL+#+ZU3 z%?Mp@Nh?#DuS8;{#aMcRoL6!)WFKF%~@+g&* z2*BWUV%b{qT0%45OeI#L*!Yz0chxy#;0f(MTK$ysxfo2Qkz(a;92N9s;Z85p%EXBb zKFpg4VPeMJSxez_Rc%{OQ!5$ajw;M_C=Z>?NBzB=lX7RK#jGnHzJ5XWIro)W=r+xH zMQ~%}LG8kUMx%R+2-&HtFF5!9AJne$Hb?qm%Sd^#VXdMM&vY`B!NUXUOZ?X^z!^Y>wfWk?46rW-HlLU zc5|d%?QNG^eD1uyUoHLpU9T<`Dz|+pQ9LtxebY&Tm(SCosbDKBglIpaf4lejuUAVp zA$K^0tOroL3~IH*OR)t+QrB|o(b&0mOiPDVTShawSACc+HXuNQr@la$U9me*_tQ=i zy18*givzoHdfTCSK7GyiQ>F*G%@dc;GZQI?EAHcmCodsGCG>91sP(GjPuzjeeeUIY z=Po3^jgvw*O;@>0MQE_moc}QQ3?0I`fy;F@ki>LyZjtYO7V035!{Z%j6;`(ddfdoSaUAceC_o{(^ zdLoK8^_P@%F~Zc+o^D3G?L3pO%yb+$Z+}>`u>V)hnGyrX*9rXds3U;*Bc?`%w^*(X z(eM;uZoRCZc$4IAf1{6vzh5iKE9~adZDx2Oj`sh_3Z`IR9uSrIp?>*ouReDbr9@qA zv)j_+5FWBwUN#*EZ(9e_LV(W?*pWdee;D#;$b<2nOG4ExH<7%eC~A&gEHdW#3hkLSC^ zis|GTZ_!m>DFi$7lspWEhKT|qP&Q3!M@W!!iWY`3omcV-D2V&V)_99Mi!c9X;Ncp*$R(lgB0Q#wrH;nj8dcA6irD~~9X zj5?v38ew*Y4~Xlm$}MH+uyV9+&c}qlUa3to?j6OcB!#Jhk9r&Hvq54mMIH;>shWc8 z(lH8-^v~TkY{0G|?&h5&3!7(f*W0~N=x;8N$=ILkkuO>7nL&yIQG{V<&;0^`W zkdo%(SrtY!xHihXI)zp$jGHQb8~aF<4|@W;Z$V$5>+7ZvAE4;^nDX9bavjg;zVZK! z&${_mGX6EDWxZDSPgHw7{fxDGoO-8g+O|u6GpCn6gDwRoHCp3ew5>;O<*>`H>QuNL zPBeI%wRB2~OV6(u9lbMM%CFp?N;Fzw=w6X{znf4xCn0tO{bnZXbbJ(aBk-o zE>8baaq-PPXnoU+8x!jOH(WOUxj@$6W3GGNUEGGaxuVSOdFcs~1PQx!YG;#;+G1ZG6%ED`tbwAgQ$X5-UVy1NOUeyP-$FUDGV zSgxXNTi>2E4}7Ov`xG~WiV^8$obXs9|Bcg(UKxD%SlyR6{?0#D2X!g#60rQgw@3fi zFa@~Vyca-aaDwqeKBz+rCV-8v z+`}=aLZo5#aJwBY=>-U*rYt1|nLT3_yM?a|E@yO(*jHEvKVABkjvPH}kO;N)Qu8Qv zc`T1WRpJVs$H-90DRd0i#*cgXq4)nWs12wnlwYitH+XF+XXvJsX%M$QObeC1aLuOl z>1i_12KskooSKO>!fZ?r5-%XCRFkg`5#a2+8K?yGDu~5Xo3@Y-O%#fU4&os(AW4uk zxBw&*?iSA4ZrocQvZ~HweGK{yiP-jG2~*I5QfE22#AJrSH3bn6@naRb5qQeU1i9 zC4@sz3)~yxHV-UOZuYW&5R){qD1F!=b?tyle^xoIUQ9_mou5%-fC|qRo1Q*pNc;hnP-|u%78tM*l}T(Um-O! z?BVIkuY6+cptiQr6cvqurs|i58hHFg&okbkMvh?84WFn6rlr~Z zc#WmRDxF#1ot~F79A~UV^+g09T!lH|fs3=R0rGf42T9jC!8!6{fEIQDcKHx&+jNrH zW?rCRWLxq1EE2vBM>(5Ff58r&oO~;TOSp`Ya)_!b=d)%xUgL)mzCj8BxVIuJlDy65 z+kBgbKclTr{_zi2NK`FM26{SLoFzH0121E)X~zP1Bh{i({{+uSYeJ^Jn%Ll3#D;Z$ z-Kd!paY)_q|Nd%2HdY*YfGYFMfxECxAyp1u7{pPpv_(wG-eT~5z|Jnp(2l$x!Yd^o}$nktUT-zNGa*Y{hYcKmx&HPV8UO$=V{+n5!d9W$b3u{=&XoujbgL;G5!Ajtfuq*A1$1zw?)-7ky zb85$AdKObI+L{(-X~nxNA`pKvPUC8=$C^bW8BoT@%m$9)CHjNc5Jl8ez1no(2Zz(3hJ?loT zz$sZ#*F4z(Oxh4{pDc0Qv(i*{y-K3%CGXX_3V8?iqu3X^$pd*9arHS@7?*Fa=7UD< z8?RjaiB*kUqRVa09y=USU)Bvf)3<-vZ*(}EpsvOiscU0j4VLs2!W^{b^`m$6(7%i~ zMTZezpQ^TOASd?V;-6@h@3>SoYTx@CnHHdq?>C{+=!Fyiy=ZL3miltCI}juHw0+$c z1d3eq%^ZwS(tjqk^F!`(O~($q^^|Dra}n9yH}q|CV2x-cDA-b&N9F{(Fwc1PlTWKM zPK!JQWOhHwvI)ez?S-@Zb z`GuiSyJh7gdEylTpgVAE6?)vP8zvcaF2mxONPN`zwbGUByp1!Z<$>}S`|JNa-omv4 zd5dUpG$}OLc;o$vx*k?N{AG@_M)eABuYhjAK}N9L0LR(9Kq8gPC7hJK@a<{0EBlJV z7n|`$?=jekG2^4rQyqBtIWCjyl=-@DRv7dwGKk+XBl%Ufz9exjY8IJi4&0pwg{Z?yk}mgg#uh_SPQwzQ_elh3z44Ks?=sNvtk8y)>(C^H{$oiE-D zG10KC8YZKvF2jEf31Q{qC*89SacT|G=M{L6&TgpRpt~5b@KK_ZGH6OiOyQb=zavsV zW4+W)-^sH_GVPZXucbF!Sis=&S7ACnu5AgJkJzIWkYnRPm+0>W$KS z<6jI!8dj7R8kw4TUp)+&&OW!QGFZM&y7I=|tI_E4L zB{O~rfj5P3_IQLO-LN9qVARm#ce+KEx@X@b&vI*@4G<`2#6llZA`?uRh=3+mmDNp! z!0G=Tu1uJGKD54$c!NxHi`UiRP5Kqz+G7$dq6c;9Rv{Ri*}2IHZ4|6E^jE(utO_Nl zxhx|JLtS9VURC_73U4NCy%wwnj9H|N5k`lv*{<&UiRszgp7n(h%!VNt=?%SnF3yd( zy(QEg%@UojE7qFIE{R@Wn&j6I*LNY}f)6hN}$pwrc)ax}Qe{?{!bI56vK z>YT)>yMe%tc{eO_L@sWP1MaI(wKu>yaZnUf#VuYS8*Hzg#w6OEnf3oqo~o+c%LRaE z_$Aooq(is_Bz|Zgb8$>YU44mPxR{9noef~l2TV1?)TaM@c{pzgcStebn}UYkR%me# z5?BklmIBwVHJv=#%Hq z5T#_Y-M0Q&@Um9|*Q)BPn^bvNfJn7rbd!@fb<_y~hY!h_tVsrOfmM^9P4T<63}0E> z&SrKblWF`BMxOKg0|e94q58O+LC?paPw9E%H|Q;GRE+An zrui|ACgdk=V_HG*di3D?N}1mc>R{2{gfR24kDD8u5Ze7moisetj*lYfyrUPCg|3JM z8_>wqluhJ;lGZo8avf6=!a|~m%UaXqVH8(K_0Gv&Nix&UoeOcPfl!elr|r;)>By)s zTWQTQNupFBx0MnBIUfLHp)y;UJ3j_=>*7 zBZl1SI$~doW8xq4hPSgPyDU|KfgNG87NIB zf4Si^6EW=n8Q&70s4lwDR$9eqmXdRZ4`{mPy!^T>%bmR=2Q9V5zeDhVARf^Fi}aB8 z%T+4(XGy@mZ$r?2r<0)bXD6^~xF_Z=n-wVOVciwJx`%!rMEJild1?|I?<#kesFgML z>d)~m%1MP(^lp2<&Bs>b*^JqXJk5Uj&kH#m0hiA&@9&W}FfiRues0@z)G-lxmVEOv zV`zE&RoTLlQfC82&0SsIwhnZ2L8s5{dD(8MiiIN%wMl)B;pw%fl(ELR_cQS@(ScjV z3ocq*TpqNZ#kd3UD6|9pJ$Hs=#4Oo;OE2Gq;)-rGLc(P*%iVVChO5L^_(xTgg*s6* z7r{xoyO2Nr?)iPbQ!yJ-z~ypJNvQ^V^o?Q0C%Rx~hLNka(xNy`8Tj8<%&j~^WA^cX)DPT_ z0L+n+%@D@hzB+h1gHP}YIn)6nJwMcgpp*Rewd-o_0!t)JzNcYZQ*Y2QxjvOF%EnSk z4&1$pXSC6ceqo=xG%>;L9>ctah&p9x7T`Fo1*3rf6&jwQgnOK;L9)iam-URV3hDh! zmI;vlCFY~5r= z56utD?PyIW&uRwJq|4%$g~Z3BBP2d!h!UGdr#nUO4LDY3cl(OgKZOIqk}F>L3&J;c z2hV#-)QuyQXSO@f?Y*XisPv%b+QFVQZK?KWbgjz6uU==-B%3)p;72iY2Q+KT8kbjH z*}nnzWAuS+b{A)g_nAG?05Mt8c2uKaUG6evjel-m0z(1F&v(V4SiRhQkNEJdk2|}j zy)5S}e3nnYyGAD7Hvg^Q_N0SjMx|<|Ordt_o2x5>7t?9_IvnTefXQd^@RD)$9kU=wt$yo0GBbmVzn{La1k;nvfY;=9>tHJw!)ZJ{C#evDjL%D+( z?{pfoNYmfEq)+Z@lvFMXjpOP+La|#1N5|sG+8?e(*qCkKdf{M1-m?zBJEZqq*lqqi zIc`SB`W4?J@`nR`^SE^ZPO*5DsjiGt^EE$W$-%<)|=jGX`xgd|IE5l}xOJq&v9go|6d!xut2zsKEaIc)_CXk#^NR+Z~U7IQN7pcFRP>{OeWD?Oc!p3a}! z@8n1?*#_>9uokr$c`N;lW4#khf0yBy2gA&sH?%jU%rk6*pX20fr(kzYf;V&0mi!M| zc+*@!0pR=$Yu*1z1Hh03lS0UuA@TaveN@%Mz)+RRQRs_h)iVomt9to?hq$bmD#3*% zn&c!K-I#;hy@K-sq0hQx_XyWyC0toIJU=jiEfH_EQ15e(=sc{HbK*+Tr$qi`D=KO1 zJCmDP?LVGaIFLpNGhPOg84?wt_j}#*u#O?Vim&l=j!jM10vb zuP=&#$~9B^$ia%KWc6jfe+2iVl6;<1#*kmd`$M@n$yP^&f6h4fln*UTZc zce@$C6M=Dj&JE53NrNnv1GAENa1;w4In_luK3l23p969s;mDEX`XuPdn42IT0|gZz zJ9r9#JKmHH!BkTf8aAEwbvVp=ykX8;5%OGt=YwQ|V&Uk(zY75{Rrn_k&7)&qq)GC+t+QSLWvhYS z?t=!+Ii~kyPXFprbnj^vlFGi_7JDP%H2a+n``4o^6Yz-YVcGbJMvsoiH|jS6Wgkd}h+;2>0~Bw+sz$WL$p znyAEQ|5atU@%;BER&3_odN!|6=RF4;38O<#q5(@(PT()4wR&=z>j0{>WI}HT95^V` z1L#8mJ}Ksw!0GE(Ea$@4Uw@2Pf7IMkY2Vm+7Mcx0gd}6F9<@-iVX3PnLR|~s3cnZ* zXFeqdcNc`r`w~h4 z^&{qi8}C=1p%x!Dkmkm5?5nn`)YcTYWUBXT^?Iv3#c0`N3_kd#mR#eZzUTV;ui~yg zjEB!i&L^ul4+lNdofV?oVFd4U+9!Fnj3#2n|!2sr;ymm452Xvvk4COiGI1`CfBM>1fOPw=?2J&ft1N{MG>N(mIO)EIHbAgC>%}AT& z%<#@Ix23n?@xQqG$O6)e;?WLo(Os|g7UI%@bT$2Y8U537A>C0L(;fM#tD5%A5$y^y z!Uv+k2QM?ebX%rUn3T~0eM`5Ofb5;^du=TLS>01Vwj3iyo`bn!a4Qu$pDk` z)WVQJEY|3Ax!SObK{C7U93$^ijM^4ew&To$MB=;R0^)L}Ix!JLdtMri+lcGFOVSb9 zI@onZQ&)2-brZ5j|4f}d{D!qW-w=#BB3G%TtSyPjJmCDRiu%RY4X>G+h>C@+S`rz8 z{>2z1@EY3hxQ|zQq!P1PR{VyLe4)WN^rrjw>bFkIR8xgFXVle23i(fY{YP214^J|Y zpI9A!2X?0|=;MVf>`vc_h~mBY`v;Yi3?N2JZaBlI`E^(zYC{UhV{}Y>ZlQwrXnNnP z5~aG}kfryjCuoT23(cks<+@IWEP9Ri;^_SFR%-r5x7A=}ypmgQk9WVcPqtr)is{M$ z$5J=50q%EdO?&rx&mI5!8XpIcwJ{I3k~-f^b{Sq-l{z+PA~COu4X4`K@P2S6E0IKm zYdw_tQ*t<~sYqb3uiwXZ4Fqk-MZxfQVTXw;sk!%>5e6u>#j9FmfdL5= zcw_Z&9yaj51*rfwwUC1)ug5!gS?=owS6b)O?dyc8De%>OFb+N-?{yRU!PChz#M7*u z$i#GAJHATaq{`qb+nPkUKwcB};)?6e0q_&Dc}8-IhH~r?SK^VWOiF9t7aLQiRM*399bgB z9nu5QyPcIx`LUcIGytO87p>NB?I&=Ag2nnZKeC_f3f+i22XxbD@N*(v(rj)Fuf9-N z*3P&OOfXFzbU#15KD=`C1^r^3RJ&`K3;o%sS6Zc${#Lk z=1!9wmJLjMqsB^yK5hAKT8)$cX8m{@-pSx{FIefuAmLldxNqI3m(}-vG2K?dHuAf< zTKKzq-jcnbsIPr3+i+gZS9vR1vKyI0xQzkrmO^feEJ%Ts)qGtE83H%1`uXo;P}ZimOVlt=bmEtTK6(*>4LcG?R_o zBZ!z@!cnwo6b~v zP5gp*)vDdpKab+Ax2EQaHCkme7Rt+&qv;MiGQvhw;+XThx%muOyPY!ni-}fk{Nts| zlfZ3Zq67yZ6ZYb*tL6tx*9w_)i4ilYq|V8x{N_Eu_jXnd32+`e?d#*O?o#f^SeD3{ zQ((+%0;mbP)%Fy*HetwPedV;F3aJXl7hH^nD)T`+yZ-Gp9FJDCU|2h?sH#=~jP4#B#d58CPhKKY z_XshLm57cyFXGmVkt+Jxa?@AdkjLur;aP)c;;>Ba(jny>A{8*0`ih6n)@iW$)TOQ} zPLj|Xp-0w`pY|f^fmks^-P&2G^pBB}Of0Rg!2HYGi=f(gWufcP^S96?MIRiQbL}vV zw(Aw2MJ39wpjTpdL12-oH{LYCpCmN<9S6*;Ky8emk(pRfI>A>pyd089;m^`8=@|cw z_Z?>f4;T6Gm@5OULOK!mgfvZ$V^!C^%&srSdWTw@V?+(Py+C3$KbXv(DV~B81k>V3 z;Ieen@8q()fs-+Lej&?&fKY{k=+Yi{)qr_F`=a^tCg@WfXM1B=V7C;X_5OoX8k;)` zyAmmmw5|p(TX$z5MU9aPOr?5O=iBPC88-^n-`tD%m{#D=?I5TeB6!i z0>dO42;q&L(RKZCt=aIfU{9eT47+K1d0PpZ-DguXM#l7s9QJHc7MP%p&hjqOc+b>WO=z`Iq(MYp+&% z^5b9k@o z;dwVgL!7?{>~)y@8c-Zb@X96&Q1c!9>Qc8Giz8dfF6Nfo?#vvVLWK_6mLnpM%4sL; zL#zo)FA4_kYzsNdbSh!^(-P>EU<+~GhpaQz0|dv0r?4p>7oa3PJB)Jpftp@M0i&5c zc6WW*&7J9PKhXhpJ-Dzdzrw4al1{katH4u1<50_EccAYZyO!T4!B_AgpI;y|w)(;x z5FmE=iMiq4EoCo@c-Zr7um}Io_WA#CcV=3c*%}*vq-ABDOA+2!> zX^NUayj#Li%<$D6$G)fFd!RZ$C%3VnPI<%fD zx8kCX_|%w5lePguTV%DuUb>Vk;#ev>@VgBLJx?7)w{i|FnXDVFY+o^LK#~C{uC=CI z|4qrLeR{FpA;iPS*t=TW_PAK~hP)G$wriD3+*3zEO!Ftg~JnHyeZt-2-8{d4>M(h5lh;7o<4aty%P+o1JV@s7{R6JnEHa=>6wwr;JLW>mmx)jAU z7HeR(f{ReA;w$1}6(Q-39&J4nlMao%C7A`)HJdL=F6)!e<8_A0aTcqOi0^O*PSmHV zgb}PMg3|&{*gq;G=ASZ~OCg1jK!eRMv6`02oQA6e;rXo+pMEq#F@i+ZjO>VUSfhOY zDxNC;iDTIg11%}JAp%U)@|944$a5{Y@nClOUGZ>wkIb2e5YfYL!77zuEGh8+`K9)) z@2w=XOkH4(F-_-t+3qt<=(Fw4UjZ-Ai;&NUhoT41_WbpX9Igxmy2=3U!6X* z;{MF+bOoU62Zq_sp8nakm_BbEn29u8#V?&MwOGJ?UbZv>W#8F`owTW*25aG89!=*< zDfnIjYopwW+F6vs%QGDQ1a8U66Nh)0GZDC)o|)m-(9pdY1{6E_3QipdnT@%jjV+R! zJNJpny|3jAD^vaS!YXsU5ro|UC;&3BZFzMd0-=R$dr;mEI{@Z$)jr5An*!iHRf^Vl z{Ih?6?d-x{sM@k}Kd9(uh63X_yM8M{aH>R#-i0%^>*^g{ zC>|U*NXKdw|ug26F$C8Sz?8|RTW$xZj@0~ zKgo!DECKE$Uq8uH?qj&c6?w26&9vYj&?EG6bd36^x=IycMmb=A+lMc(QS}6;hhNizf-my4EN&RBN8Cfd9p~l@jOG$y< zfoDzq8EWyPlY2{TnRITfD@v;->-y2%}tW?3`cL#~bxvj~+A6)1WT+i0;IP{kk z?5ZHEt2_pK@H#iJQXAt{n>0_)rHZ_LRYm34D07ML{JTxq?g z1LKxWNV}G>-~YN)^N()g7*dHlJv->VIY=qZqyq_SHw2;6%)zUU#_1)CMPs1trG?Ie z4;t$H3Sh-18CBjgf`G@i-6HHQi?Q(O*p*f7H`kI#VwiJ-^A_>`8~cX?sp@EjV^1|{J74vqXHkcMIp`U zwpOx^St+RRdMg}&q&K(%x zUBEy~31aoZ{9zyX|07Qrm)JHt+u&gW|5t{xKo@>YSjE3%mj9)3xEb)zd!Bk~d}B*k ztTV~%DzNd*n0PLL`Qy*zm@3a#qxVRmledbla6;_Y7{`hiIh-yZr`O(xq%$gHsIPHv zi?-cJkx6!lCB9>fI2y=H?oKSpGS6zkHX{8*<|p6TmJ=}uY#kJjN8G_k;ED(g?Q zUVl~AVp_6NO136n=byiBdr&Ut_c*NhA^msd#541!TDGIU*}xPR_TVEs|3P`|m&G(t z{*XfXOErL|LxvAg831b!b+>%HetNIqL@V2lEqo?#Ix3MPqXtPRN;R_uR^h>@j72&7JzaH)Vrvd;Y&{W6qG6U9g_U`hg zW!i15w)>^0oqMg z5kyx0BfEeMjfUqcbUf%nuuCsqPdI3`>QkMI?xa2#w`%5@2qB+l=!FkhwunvtWg<%+ zd;yg~NU!TFg;cCa_tu+Dw`D_m_rDJO4!xGUzwyCjI_WG*_J@Th!kXQysLpvNd}LkKOKbaZ zD>V}>M7wWQ>$hR_(ojGge>!xuqL+4o#RlzPOJvB$#CwU)g%m|&3%w~nZ zEO>f@X6JS^VL4{RfxzA1mX3x^JZZNg9253xP!6ACl=2U;4ZG88Z$1C-_R_Kb39e(& zJyQq_JTq(lsu8fuZg-B5v4?`@{dCpprjU0|QW^vHPVnysO$E}MG!7Snmv#|#yUi{5 zw`%q;(HUpqwv?wQd%1@VE!_J%|00Es?^5a#+ghPE)Cc2Cm$6RPkY?fh;ZhY=7`5Ly z%@AF)=<@GE`)fv;ZNpRLtrh;+p+Ja7_>+?tCkMJ_jXwj04dIj-if>O><4W1oEI*o( z-$7a9$G<-aY}%LX|E%c!vcjJ1ax&bu+ccF2nY{wlNLo^Trs*@#1o1+j9Fvv8b-ZJZ zzCs7FFa&Z6v3x=`B88*cfFtBG>=locr)hPQ&RJ9=P3mPe@@DUmUInN%+V)l>&WSsB+3Bl zd6I)b*>aU?Wx^5OPpXq}@2VpUjVvcbvM+`u0$`D61fu*?wJHR-fSIN(j*(mVkPWcl zgVX8+%OwnD`$`n?kbgZiHo0$xr+wjo8K==Byg>SPGHX?6v1_?R@=Kh!lDzUqw2D1(%Gsvq^L3IBuFbKb}UwC_Jc{iRW~qF2XN}# zmR8YXB*dAvXR)gbxnht@PQ?0AA&FjSdf^L=U?3dS(&N7(^5Z@VVZjMl`;63-8IRDkGes+ikdL@v%i zpRr(2wWe?jbRIH#onYmyE`?#=bo4lG*a@G$ulBL2Ul+7~hmFc+?MF)NS2yegk`f|) z2`Z``e&x9l{;wr+>j$dH{`REITvXJriqP%BxtImaFsHB`m*L9rIytCRHlc zJV>#46a$ss3j3QJF#M6HA#Rjf9@rDSLJnq`gU^_t-@jEggoiuA+78=;@U<#tjcD70 zY|`ne;{T3j+`|*HAyDcf`Zo=~@9j#v?@q9JKX>buy>b>0!vBlVh{#cJ^#}kKc=pP2u&Q=Y5V(mChS+q&f6ym>!kf zjb17D_ihXfSoGJLEqYcT6x4Q@Tz9YcJ{7>Ye=?hMLAiWy{V(x+@}AlTqv zFnTJsxQ+TG@K*Vp+wx`%XnYf4`D=8q$9BifLsG0Wj94fvSk0uF?67#c1__s^YM(Ur zo*@2|yHzDobx(4~3r^(RVlS1}AOPT;Xr!lYiP&DffLqn*6u8xcdQRCw-1rd&*_x8% zir)Z*PbP1GnAi2*e!C_5g61oT+P)&7Ao4sqL*Xkysox64dpX2@h;*fmAW!i8wR1Ie zNgUN8fX@oDd}V%cPLcPEKmyR9=$iL~e3$({v|E>L0DYnfwQwX&*JV+2k#a5SyHyYa zoC2taSziUPIz%m`(0I_ta{1Ba(?7AcEz4FKGYFP=$Ok+aLlQCkB6d)LP}6Xg61G<3 z^Bp#&+^9;^?T5dqkjnBv2UC6(b_Y5}M;=_787gr;&nSDjP0zt0lY$Yqx>%Gc-$%Fg z&<<3RI$U$B(L#QiN9=v*w*2{C8*%J$!dP8MV7+V1TFTBg!{tStykzhBl&g?UA;6N0 zZ!+_qJHtTjAin&;jCokO&o(z*U%1!e2qs494#EpkDL(%aa&_``nREXXqC7k}37BdD82lvdrT4ICY*aYjXtd;?9&+x@BG#(Wwhgdoo}ys9P^%RjkHe(u%G9&f>!j$;olwqa|~&KkP&cCoWiSarT{_I5staK&1c1 z@+KGvi#IL8lu5AJ2lGd;Icjrh)uR&oVyo8-=X9JPj^i7>W%S`eUR#xhaBltgBM03C z5Hx!Ge#edIu*giohG#bqqmH5#a;DTH_1J<;?B~aOHGdl5tjR{?6&3PdDVVM>+9__} zps~-1JA}@*+4}c>bZzQrX)xPy(2u$gi{;A-s#kz(p}FE5&q8s@#R(1UFIM+zqZhHn z(8$}y-FHA~k5&GBGTi!KkDZ|YuiWd6gIDawM>wRB{&Vl~7=9k!+p6BA>xqnQuN;MQ zKp*}ESkOEtpi%n{YM&AFulGsy=TB-|hn0aho4(ncKE`SUswe*c#dxi=?#I>^yaFn3#0>iG<5UafIA!!A5aq*GH9y+W4TP4o-n zx=!P{bDgJ&-`-{x)fN<{7V!NW^)Yg#1NBvdR99@5QU6|9K%Grk7oPjds0~-L=(Rs$ zp1bAc!4BTRl*xh$*>j4Ux?rTom2nNnWsA)z$oz;Bl7*F zdp~a^V78RKpC$|F2QUO23tShb*gRrNVr69h3l!kX-(+MIbA*Qit{lhSXXNM-A}~w5 zmJMO4RK3eu&8*VnJp!~A|0T&!)9xsY7hP%jI>H*S7IU!6CS8;1QzSkO{98hq&J8B^ zQ_{`Zzz=yiE`GLf;7&5r)19#i1|Gv_#gcCXGikt;woPs8+261v(f@r!|B9&$Zr@}) zV~-3l{w4T`;g<#}*{DQNFspTRj8i0U--v&Mni&6)!?5J_S{Tr=isahe-eV?$w%S^h&cr-Z6H&({x*UYUY1 zXd>T94myOZFM7JJ($w=2L%#t0R}9+2)8wl(ILy>$a~TpDyb<=;Dek7LY{%lX5OS~B zYwtz@6n)>xH?C~66>_fFa)-q({EoMJ|B|530 z^bL;r3zC+nh4qQfI}fV}duDcZADL?sNQxO{+*m3w_1B_TI8GXJ$;k4MevQGUkG<^b zp0`oLh4pE>eKzp%(}G+fm;q#4W~<-ZvrHvrFVSnZ`^vzK*(c$ZbdXV;9L^&-E%gvY z>}B`wSbyTn*@lyvx=oQj#eYFg#}rkyct6)2fRg4InZBGEi!7D)?h^D5-YP*WzH(jG~5~mB_`R6 zwi;Gxpa=?mqiU1ue7Kk@|Df+HeJ|~$4_w#(+iH~r70~7UyQZYUx3c-0UDy~Oa6lg} z7!uI7@o5X&B1P3K_V)860Ms1%=lGhM(x>L{)Ug0)H=)Ma-H?=O++tbCcB*)dLnC{!x9 zFiaz{;65X3d3Uo8l4;0EM>upB1v>tLlw_>D03|1cL$Th1TiJ8VTd$6LRW8tJ%oHsBey z8&ipst$Tu&)O!lsOD?S%ChxQUL!Aa=;>A$Xsjx29nV-S|l%U1FY!Abmf*v65L^w_A zBO0cnW4XIaog(mJsbiKBq8OMo}~vCGZ6;?9@w!ou%L z-nUyEbLnj^f4&5_pyN3h`=KI14`8utK*W8wVKC1rWQO-={s4H2I$!JtwpyA7VAw=1 z=3o7LiT_a)iD=skKmj~w0kQ;sER=nTvoqRW%q8t{=RQsY_;rH?z{2T*Ey^xVt!JNZ zs(QwL(@un+gT49zw&=Mpu_x3y8F1S8HlPmZo^RAp=+7 zUol2WBWBFq@ZeGTQSKfZiYQxw8tP(xFLFW`Nm+nhr6frK&-V^_4b5gZOSxzC!;+s& zRE36)PN($j9)Xs>zgbS5=7Ri0;-sL8)&rWGPR7JRNzXL7R61H0-Z&1KFSjP5!eKQBOw@i8Rs zv_ZE>{#a3lJ;<6rCX0De-k$?wXXa9^Nc9gLsI@w^t!HcxzL}i9VdgStmYLuc&iC3G zQrR}0xpfts4&m5rmR0(dx0chZ->aAR-g$+r04!6eH0EoFtuiWP>rx?y&L4^^T``Kx zO?*};i>gHpS)5$y8i7{G^>qoh801$Be5o?}v2#@%Vo@vSq;FG+xT+kQq+*ZK>GRbn z)@Cb~t2`WTRBTK*apJNy2;HcXeEDoZsiaImb!)+K(a7NVhKmAE5`lf4SiJe1-DPZ) zl5;}SOcuv8$qS0Mz4@}| zDUR?9r@J@W8O+(OAsadUL>d``Q;&R|^_98#VAe72#O>7IJ$m z83_U^UH{jQ5lqFz8x#nuoXw@<6Yh97h1)ii%)|;(!`h6LcCEpc)fVCSf_mMlX9w+=l>;aboMp3Z?B6gu<`G2wFlG$ z@bn-E?MdT_!xZCld`H}^?SovXn9(UV^2HSiU_iIA28ukrU&ZIi5HCHZ$Rthw-7c$^yKx!nv)H3&kF{YD1& z-7<*7v9~S0*vbMEVkHXauDpeF0)H2_w_nm*w-*wl0J88m7&ZXa0MELwoGC9W5T0Zc zl^7Yo7$eD3vqb$x>x(SrBLrE#YLBn!GPWXor385cTgalDrPbs7wPLr$>!p41 zx!$v}sjGz;8(&6^`r+o}otB-JPq&Fd_GR*|)wibB=#kdgJ%gSB%|>q#HtuiT-lN{Q z&-mKxpu}ATFFph&!a?_dM?>^Q|KMq-l;LrT=9=NtfpmG|+9wx*mV1gBA3esBH3yZS zS>G>Vfo7T=*=hQmr}fN5$<~4IgxAD*eDGk-omLlnI%!(z8>5(!v-5j*2>WtT3E$2B z5uK#FXY5H5Fwef@CEBq8KD>WyMXrA9Gs(b>R|PF*g=T8@bR9yA6-Q1JtK4K<${_m} zAyYZ|U*87=+su}pXoW(!&ZWXb&6*Mhs!lWxUoKWbeTTJYaS~ax*obfC2Gs2ps?w+2 zo}79up2K10BxR%0f22@$^aq|l6*4Gbw4CG0y}~=%ox^=cuz*E$^Apwi`1eoI|44mU z4pRT)vI@oyNA)er4OA?8bMEby@^?mI%-CV$ka+?%BsWu>0R(Xe`T^JZ9M0NJ{%^Ipw@_i@OGH6 zz0RApVvpHD<@wt+bcAs%_Hz(ZVp zh(S<`-y}c2!xinTH8G#uhs*{zomWw1jUIuTp{8o9r;2hsX5cZQXX)y`>*K73Mu7O8ve!hSQ7v092p|`+Rf(4coG^b6s%rNzI6pNJPUP`ir~4vyhU{w&1$u03YF1Zw&1+9u`fLZO>uP0oCnx2b*fuMCxa;=% zp?V>DS0+f5$$7VSsC~m@M1>7T9P7>Uty~W};Z-cU^3YD!m)L@N`LXbj@NOt2>yi`l zW~yUDjyR;byclt+3novtr8+W>*_{@e-R1#w`d{EW>OBYGXs#Vps5umc*)haVEZAT8 zAoB8&DV#pPz_(KlP{K%~#TW$i0m_;(+%6OFH{##rzf$e|*M;Nq-#$()D*)?FM)Rn- z@@rP9-S;+`{s#PVxoOEG4#Lw`xSb6sAM`iY1F?D9)F$E zXlk^H5rPe6HHRMZt;)(5#P)Y4cTpR!vROIsfdcN4LL>TvCRAS^Bh+44_!rz#e zhzgAkLwtWbZ3?N5P?)6e{p3Le&J#;QQw_xcVLO*cA?X!C|Lko9mwStIaT2BrFfW{?bTN5;47%6Ef(9Da{PJ6rRZ{ zAfxl^B&sYlnWzq`NWk>gY^Dk7aakqZ$6wTt@XIF+>A zmXWY|PL@0ZzwFHz5pJjjq4p#R>_Obe4A?pg z@21^FRQ)>gBc(84O=CI{wLeH2w|1SKOzobyP85&x3TvTk&F11CXK0Ru)WTc`1F<{r zopjcnNtr_}OK(XBa$q+Da7Vpd>zm}252Ug%@7$qq-;razwtdtr-T752MReHT+myor z?Q)*e){ZCdfo7W;7p5w0eV}c)xAS;v&pB75S#u_X8eoUaDz_jdI!*H+J_`g|e6%-u zdWQm!Ji&1}99BJ@Ub7F|d$Q(nYMRAR$K|jt=N{Njeq$Rj*}NTeIJfv%J#asUP9r@h zgcEvi7azFjLG$(BcaPGYJFEYitf@s%uPHTmZXN=+>uCOFd(fRVv>AD&iwdVN$rD(8 zPd9i5v32c%gzDYERFJs#2|cD^R(YAa1S;hGBz2_%aq6o{zGiE1?(;1)40u>IpL-+r8A~;M|_Zx#Z-~-Jop_=hWgVQve8V z{++CHWr^y6mjImm=-@t#Z#hdXKGN816n>jvPIe;bz%O;iUfR$HbO1~lZ*E?y_8~?Q zpP(@;o4|MU{rV5+nuBrT@TbRVGFnF9np-$0fH0g_EhkZMlbx$GVF9jB8@ftMz_Bl{ zplq7_o`7Jnpo*|rvusAyyO<~=(asQW;cU+zui=_>Ji$0+vS9`3kwLHvkE(q&WyUG4 z@cSM7Bm4CuMStL5Zch7Fp+mJ}zV&*8c`=#hd(t7#kXBOsbC#;=dW>)W7i75_G&xrzSb!rCwg~SrmcRety%Nvxzr}gElCy= zc8tdQAu&pn!i4@HB|_7`5KJ}C!jYIEOU*_d&4={-xWdfKhXKA|iH@DzX=VA*AjXeH z<5vz}o$`XQzhm9XYqP~&`Vc#Fy7hx7Gxt;{Z;SQ%Ro~*(1!1t_z5UA2$qU(iz3Ur2 zUSMy_@Y7Sq8N8BZbp24mkrL^i!V8?Z66VF4<)+5q8{=sIM+*T(?E1~9qd89DnrPKZ z<*|U_l257At0CVh4{aNb8V_1Lz|v@{kX~l~Ag2y-8zgO@Ihx1;Cxq~vjD*FYPgx$R zAZ3KH3f48EF5)%WWRB&=hLY#(I`=IrSGXn0o`sIV6lvT~^D zwNd7(;Q!2YO7?v`c*2{y0{Scy@uUa2;VgzGBW`1wyfYVEB&VKGO-+4!>>7yyJ7Biw z+)%D(@c~2FsR%fOELz|UD)n=7yejQR-uWfvD+=0))qJMeWYi3-_^b-mE zrz>ERHL!s{Jz#mbsqy{3{OKJ*G&7X|*E`tHDCsW|p3 z^kQE;Jjgq5!cV(;d-0g9ATgSg=L0=DdvlHv5sBO{nM*KW! z7i;gXNI|KkpRWydbl~3*cd;Sai*DYU3X@+@cmD-lF4l&x%{R6Pp6saMrNAfdA*;ue z_~iNjfG&OebD_(FU{CNF4%`s_#$7kWadFRBz$|@NVV&Bu3ES!*k$n*j`aA-QXZZX2F$>Rko8NqW&LJo-lTlbU?*AlaT*R|K|9yElRWZN{gLZg;G z^{4c_?w)$m=-Fp2JeJJ*xA!3gtE~MYLHzrvnJPbV$01hyyxKL@KJ^({3MqZ_tY-a_ zOMH=)CZ|0dDAxG_u$%?yHDXtxKVk&*gVsfdYS%w#8&z4LTleGC;6++#gC8$3^Iq_~ zoJ42)kR` zRvLdXMa%T4h@<4Vk5^ zMn5+5J5PomnUbF)4NG^=80%-fYwHY!$*ZIX8AT}Uw^NjCsvkFV{Wnr6dvkPY7dCYe_fmo~1vet;U=KrJ@#9nv-ufMRfw&_h zw4$VFqoGB(KOXft&Zl;M)lGLjiEc;`8`YuDTV^-FZPgPBxINX*YNQ1No|`JXO2F4A zWSyFWMYF5#1o$uBWD^>!)mVPyq%-Rl>Ms=j>oLRWOU1?_w*6GQ%oVwqVu;I^S@3D$nVjZJW=9YU>Xy;gt?yTkKh#bnaG5e3DlxIVxH?*|?it`Qs0Yq*AghZRe;K zJF!hR{E@NJ8@*Ffv;!sU@)H#`t*#!crXYmYV4UcQb-t+X#G@-ZaUt=gH_0DS-H^VO zCsQ5UN_JqEYH+Y3`oZ+ACM$Z_w9l)+*)Jxk1xdE;A%5LbxDz_y7Y_r!G8WXGnpKdx zWbH>`*9U&uVK#k(YvhT43<|`0-hh8+0E>Kg+&0fvT@vg5XU660zZsW@ng7`eTLgdf z9g~9&D^nFx9cNR}RsRyRcey4$C-X>eepjVNaf8Gxz)1y~EJKB5?Hzm^4ejYgP@ff!~xZ{fw51&)lq^U7O_vjU>#r$B)->_UZZbdj)to;TnkkRr|rg#gT zNUdI^Z!G4NxdZT?N$%}sK+M*TsU2;mMrewr$WOpnzEnOlhqHO{K27e%iong6orU}B zbadSPohgGG7v_@LH`ZqJSzhS{0dHi?0`uLXDH$>MFY?B-PH(x<&H^IK)Q{7QyRG52 zKvk_vP#Q0HT3b+lKpSR+zn~Je*U3l4#xl>{y?8ZViF+Bn8)8;IbQ|ltI@|o zzD5Cz!=Gt+gnE1yuDu|*!OYtu1^hKpocR4F99<%QH0t!L_hPmqa~R_opgB@nrCjM( z^6Rf*z2OtUXV$i&013&ko?sRNESC{HEAcJ#?J)h~w6r!tInMg(>R;AYor{sva5vH1 zTjdISJWHY59)wb3x<`HQYeO2=rM41&X z)vPUCU<{SgsT81b=S7nI3N`>?yNP-wk-aey1-fd;dTSf6SgFo%w;=O$2&s?KBVH89APoshK|}sZ^)dy4WbPd4m^ha zM5Uhuc-Cpbk9+g+*&5Lgf^i*D!lzD%1rH);?QnPIVnQ&4%pg{|@AMFQr<2{}cMEju z>;LotRIKWW96bClXw{nnw7&ez{wm8y4*wMw)Q3pdMuKEH_dKNR+xlZ zQ3DU>$4KOFuD+R=suT_f#K&Kb?#q%&t${1nC<5bg!v(@%q_xy{3EP&aquJZ@jb1~K z`k>jrn*_6!>rKWz?1Z?erdn7ehd9_+Y)0HuijEg;%FVe3`C7-Mxx%~7VRdS;8@_gd zk;KUIrf|t_#`l^8?>emRIg{Sy6opu_&WB5Y>LPV5G2_QNw;whd-qbSbKgtCN*h}2dYhvC`Hi(#`3@(n<@Kg@6FCtt2lC+j9^-RKbD+)e-#(4GMT zsCBOr?(OzxJF)ay38rk?jR#6)o`6l!^`Mq)43cw02>2@9A8CaQPE-CYp<%-%!T+nU zbpt4HWv27VrDloY)|zonsd5?EM2TRhGu$aVTqtCN0anDCSqSFp5kkL~&>%gh#nr~5jM-7wQ{W0?i@kcmhDeDkW6zOg zQ1TL~HJ7g`45F@^J9I5^NQK-t_x@S8Jb6%qUro2WS+M`jv*qx`bz-V!g&o$odi1U{y-ae@<%04)u6?o&OMFb`Ng?t1#12C`Z%OVL8?%Hi?_&I%wqu4W~bKVgIW$x45PM}-l&7%I`>@)!@YJZ~Tq zBEsF_ojqHC4q`*#V=IrC?TVh86@1uF)Z#f%A#8uKtJHu%b=R!66K+~xM|5oLV~)Jq z#O+;V#yZ=Z-td?s1F!7fjf`0jE(x+J+WgHG9#_~ww4b|m_PO_=!$1UaR$uSV?j!HZ z)eYf(Ukt1(hCKi8|5Vx|_ge5HA+tk657hiNlEnWrU=L>h&z7=V(?YO^ZN1yWlj+_C zBp~}4O;EW;=Wq4B=Kd-i>bnLcXs*0h|(bs}bXv#V?>N7cGK!P5-RHe!S%c@?u zsPrk((kiu$3O&Ccamm8QumsjdNSD>p?u2!&Xfwfuwcg3c+}1K=tmk+xT2{)P@1k|V zjS~*+u8xeZr%{Is(CWRF*Wz}k_n%m8r)>mm83JV^7Aj?o@jcG8&`Z-AVo7=}fDk`` zfRR~CZ5%<8xm76QO~hiom9sg(iQ(^txY>cDhgNO>4eoH!8vumpcT5Su<^X*N3edkB z$iHDN^bR2aTSw8J>H4+Es-{7fc#w`};4UD9}}p9TqblYHPtp^j=r;>NPT++1~Y z6^U;9f<>LI$cfLM+wloUY}v?%g0xUvgg_D7@+ygh_nG*NO=I23Cb%m)1go1ppmRXb zsclrPClYuW$XddJ&}-C=p@S{1lDQNK*v(UG%-q{`DyZkU?Jg7cPAkb2QAYHCorgCL zp+AWsX4mU1O3MX2QMJ)IX?!^4A_HrXXXMEp2cN#J@|X*qnERut$DoS$JphrHbq#-i zkoIv-?M-`K+EO0YromXZUGn%$TbZJ>nMZ1Wg#PtU2rzqsjS30UIO9TmB+fpb-8z$C zr;y&x7AE#~IX!VoIHMFwcdGjmw##n)lh+f#_zLwX7P@gg+hoE>IqX%4;gsEBzv3J+ z_ph_&Xa4N!Ylog<@#>Plk#1Jo_29Ab6B~&a^C3G3f?M?MS&@X`BJui%$3(^Das{p_ zJXhPF_14krw)?=8d1IMkW{pYVO|9xr?N^UMN(J1XbHxG_qp1^&0tMo7>5fI_IL%+!cV7!-S5M`)R(OkeAN~wESSS~c;xKrFv$K(S!W5Z#I3`Q*uw5woZ^a+? z+X(|3dKypa*iD6hwJtEM5<1shBdGr77v$~f7W!<9w32ET%pHoNQNap1q*8IkeL@af zdBI&{�+5=jJ?`Ye3*%Wx25&g6-a@l?L*cxhAXTYoVeLc5NOd;Oq zxWQIL%N@W1j|(?Zc5pB%(xM-;p%Gf4&5-`#udff#1MnA(v333eu)^u?rqDU)Xs$4) z(%+|1FS=Z+e3uTeHJ2YBJYay(76Lrgx|&bkK7(sUT(gUQ#`Hv->mvN3Io<6~ZVzp} ze&n;jd9(~$!~%Y~azwFp<^!(*6ajv8NiN(Zkqd6_Q_i$XChzn|Oz8YIxBxd=nVS;~ zxjoY?!54W8eLb0Bn?BD@;HODk`t5wL0^3Ax_Q`~QVzIQ3(VmS@Vtx93-5#qOA3coYXlAoW~Y@hUeic)>R^lnVEbWo@)JIAPJ)&~1{S z{7BqpcL|pfwB?KL51|uWxfPJa%VF~|vz{;4U5a8N?8p$5#-IAaJ>ulO-)Rrb^U)}D z=|_@g+HzP=9zm^$HTX}}QF6dX;XBa^^hY0#RU6+fue8@`Q2KmE#FpK7+U^FPZ=eZW zu(TjuA*YCM`f!aZ6)KwKjQL|1Z?{n2(|M`HfdWBK{3!2sYWQCn)sN?CH6Tki4fXYA z9>XS00@NvH;vtxA*>$a!JipEX?FN0s@5; zYCS1vs&H4`TEnLB3Q8QIS*nrigkG=Nyvg9Hj4Fnb%f&|>iJu%+Y(#A}*iwQuvC;FD z0(;&uGN(97`$hzTFMB%gI5m*g$?$||5!OX7*g|?U9_2ZbGeCLEId68&jR_+f`8cV|Ea+H z_bxg}Y{N#e@;`u2av4&yW3o?vd9|!&G`{+$YjIBU$V`2QQ7-0&p?ndF+`LwnE>06i z)hEP!ByM(RU>d#i0w_;^Gk$My3GTquUe{bTEEypU>xFY3H`L&#ie+MzRzcjxq*pOr!Aq0r_oJg7UlTMxKyC-BF5n+`gz*6_ZX92 zdK)+1(tkDPiYEvBBF6>iUNzO{5yR8dc)zPl zR~Cs%POijO4P1UGZk>@z&{&#rGSQ$tB95Km@#FUnGTVtRvic&HGe^$b%b$3j^)?a_ z?Mcq@qWdD6Iva7+f~j1&v6#SR!rS#etb2X$E#A?{t%;xi9=XjPTk6MXOYXXJa1Tms zH4IIvRT1XCoiolJ8pDRHU|kDgWLhg9$hQu%Ax*8<5@5muUIWQOSe@HHGdTQERjUz3 z;cef%#9gX;@dII)=BXA$s(s^ONRHp)VTXob&_ee)<{M$7DrntzSY}jZ*79RK_-wpR zd$jRW;G{R%30*cngu__vYrz7as+cEvzS=yvfKa1$Cl%uM{gx2_o z+4x-1Yk213y=SJky(;KfO-@k8P0k1&+wmA8Ly>}3j{w4hm3 zB0T>tNHnnX@-OcGzBA@bna;`_B!7mKwZ25DfIP&b~9K z-~FWHK&Qp&Bhzj5mL0&f^hKa($upo%&{$9%D2j|=jN}U(w>w4&>bWw zOJnK})%qH`d3C5fPy0>~KsTcK)=~VzEskO@E&tP7k`NksivOM63u&qock-iNB_aN- zA0?7J+vvI+=weulbT35$jD?d|T#vL=34La|S1Is@TmXuo=-pI5eD;%<5P(LAmLp?@>!-eM_&UEP#QH{>@wB$e?)F5xC( zFB(nq8CNPkt{G3h-Y6r%0&{-$*pU(oarKf|+;Os&Q? zEj0t~`V7)#5#u-iurty~?9brlUsTEjC*SsSR9jDi{w@wqlY@~m>9FIA+saW;Que^u z7fQjceAz=oa*m4qvf0O{BT;f`!9;GsQlswXW zp(tnFZ%qP^RsMY$?bsA+++fg_$f0kUL4qMaTeOCLBj7A%`?4nLM4`!Sz!;F@)N~l; zKD!G{cxFvch0G_X(P$kYA!bZ@9Ja>fUR;$|7Eg&ZNm1W&<{$mLL(AW4RFk}~as-P`th_^Imj_3*R3#XiZS z3hO9<(IVoOXFki zv49A`KBfmcgN#%sUBGr+<6jE79)13Kv}#HgCh>>`Bb)3X+7IA3K!DG;cf*6*;6}h< zco&VZWE0&zj)E$dr)dli)2r@X)VdB@vN#sZx?~8n1f~!!7{%1B_}&(=7CO$cPK(yg z#{e4Ync?Cf^jUOHp++A!?X`$fYOn30xlHv3ucqgnR}>gt@#J3v$R<6|!~^u8nb)+G zVT`XkTfWzM0_b!uMRvkp@zFXrVX?+`V#YK@?$Nim4;}`0pi{of2h*N$^f*3ZfajH7 z0eEjRG^Yq>)4pSMR8!$G7le#IPQJC0DQLi620OeKVs!b|LrPA&(u|`p-I7>C)n)$l zUW6!@qgf2s_U#RZ_^qpIh3GZ2+3P72`A?JzY2hYzp>|FdPU%jYZRn10j!W^ckIQ;4 zC&k;RnvLdzI{DOoMTEyjzK#@XEmGVU?`D=@cc~T>6rv54`~39;uh|Xqf+)2@C$A&1 zW;dwjvs;l&cnsUBh+zx|Aq&G07ixelce1sV?6x#yPDJteqg&)wT@xdTeMh%SbmHGU zyX)wBC2Wu0k_ew{4r(l)p>8o?2`VRjO46|^z`JdT*;aqU9 z9hH})tM+OMen|a|+ctUGWrM>};+>T!@+N67RS!<-N1pcMKyO2R-p9%@R(-rvA?{Hp z%scixmUOXyRpI`+p=B1Dt|e%8g->G2?c)kL$tB57ps7~CM|@DC#Kh4?$xIJ!)H`A_ zj>pLzr(AyMcv_zD*DPGDonZV%&U>ipPjb=vly4{DIgnXtg5frRg|?g)1r&y}4SXJ_ z5fDf^UVPLaDyp&jdEcw*+G#pZ!SHD^3JCK@y=TgmmTblooTv6 z^ej!`Gu=^eL8uLbsv3u`Stpc86V>uXFv1QO)&7p-yVoqW=RAaw7oj#t-YUA&)C-ge zi-8)u7vNob;(nd3ws}ep@;Z?|q>q#<*lOl#1n45m6{=3_ zUxmrQT&z8ZcrBz30F*u86fu{Y>JT&tC?9gZ3X^t>CAsyYFe-Fxq>M%8_BPhsUNkKJ z_7zDn4v-T||MHn(Gz_HSW$Z6L6n&K9Gfmw!YzvJP9)OT^ce!24MujZm11tB?+~@d{;=QI_@?EhZ144_Lh}X*nhl&e=7_)Fp z)e$T55eRjU-6;y$KiK|n`)ryDRpvh^(-q$4#wqOSx20LBF-}!h6;g($Hv~?`EXaGb zsKGmjFM4htKFnjFBIpwqeb5Gh-lLR0m;?529Hu4ELw3WdU|n*DGrdICV76g6WzJjl z9|72X!2$CUW~G0;N3%b9r)-w=+D?(G4xHx*4~E+hpOiy(3iE8z5-5D!Yd8F1AneHW zQ_bShpa3W3Rz>fvg=%&jdIVavStylqrubrv2fNLHtIy>EE2rJ#lb`}!Gh@fu6Hl8T z`HHyI5%XHKbCX_EV4W?CGQkL(q2_LNhgwk6D(q()J59WsTfvv0@HGZ;Or4yTer!S$ zFR#*fVJgHgZ1jJ5efS^eLdUx*tFh+;>&(dwQoJsuZBE>SVpC1I*<74G znhw;PL?_;7o2kd2ir7SnG)ZtgU+A+3d^gq!I9L@r-LE>874DDv4xooe^?%byQl_~@ za~qxmXYFhSBw|?PErtIAwP;qju3ypOseT6U>3rl)|9+(`fd*#pr7NUL_o|e=w8XB` zq{n=uvl8IbX`Zeu68Kc>EASIth#QzxEHpI@JR+rh_p&JP#Z1*oX{E7N(N477v-YFA z8;rQB6xKsONo&avdgZMF*e$Tc|8X}Xg{HIT#f-EARqf@VOvzu|tgCb%g|{~$5;h3; zaI$I<6RGC(YRnSLg9IM`2XuhPqQscahbo7eB%?!2S^Y3?vl(Vt-L53OMIQ3LIsUww z6^*qIm83NO4A2dbLh z>*=CQHDuyc2TJYsTC<(FbbpT?GPa?7q zSHyrdaz!~HdKu2+3*JvCCwM1M`T-?4>MW2um3 z?2;|KBHN68NC-)?j7X9#dzM*5A=wUy#_Gm87oO4hy5lhGy02 z&m$YCiB>-|Z%KGuH#-|mJy}|R>%YHKz#o{@!(Xz_5V9=q5hGwX??Cd_+^>p(tgUT- ziAlK-(`~n+%KmD}4~ol+Qr`F69f$)Gb8*#s2Qs-bxL?+k<@M-DU;d;U-e<)!V6jIt z>vz`SfRZ2M!P!iS4irE#k#Xc4$)ff9$as%=<90(wy$jeesGH;L^)Hdq;LM3&`TgC4 z(0h9~5UcxWh&tx@=blzx4jHZ8JRsB=$Ys=`smB8m+<*Lj?*9&?J{XA6+RFbQj-Ze6 zzAFMjwed(>Peb>~8J#l_yE;>sC(kFVsws0?o|8ZcE~C`cg=IshCc{iEM<8UnS> z{X?Hi&&fvN-wM3Vc@ZW3!ZbVoJSiYteurU$_sO^yb9{=D<3#O1DHZkY?GuK(AfE8B zG#lPtCvFt5iNLheC=eEIuhvLWn$u9vRTC0acsV^5no{B^^6ihxjN2vxF65f1{cj`V!>pqwAzOn~zkeMS>=)ll6csuN@^)I3{W zTo+3T4<#~TGQL>Zpp)TIxP6rfAS;AG@(?sdjc`d?=)N#{}~pYD(5v#>pRF_Jp|C^H!~UbAv})&b_>UtXTM$ z^5Le!8A};u{4{sK>x4;pPy(g6ktKMa$?rP6+~=F@9VjGVeB`(i8&l4%*3eT3T$s&Y zHybi1S}D&$OTF8QLBdf=pfPtRvl$1G?NIa0!z9A>p4zbARptU7hb>R%yF;SybebKf z1YdcnTjnkMU}{^IrLA?_H?zhu9nereDD zOg{bhp)TwXp^0+EFioqK25`o0!_GoN@qLo>R@U~klJqR&nKLN#tU?PhDxPSo@{}Qr zMPA+UT9?_muvIbnR+wu(_jJ^`Js%_*WI)G?q$_w=C)ZC|Fed+1W3U!Xc6bXU99>7`cb9soY3a?ee%vWEXdcU_AgckKebBFCCl@FC-6 z?WZNpsENnnQV~xhlu<6s-u?M-k32yObLowKi%yh23a0f5RqW5BwWaop=jI2+gzm)m zlspJ$x>a^XVbkH`pd>>Hx`LiD;X6gL?SiCDWP4edSg6ir07;lb=Niww(x0C+H*Lej z?y>PkX_j;OGO}-+-hlyJ!YPR$+Fjp_1+>$7Zb#x#Bw@iiwFEIIm#PxIiwJ+O10@Kt z&5CC!tUN>J!#a{e2;YV?oDV-~$ulyNXv^teq9oual;^DnE@pF&m-9w0;`dWU^HZ2V zC0*x^o*e{k?;dIHG5%83`6ri;lbLT>KJUwY1DC29upCmc8zUK*WIe;;EQpU(<{9W8 zX#SS?ChN`sf49WW;{@}H5#5-!u4uU!qwC2JGu(HTR&sr3q3Rpe0+U4}rm-WkEphA4 zk{n|r?=xRiE!G$b9!$8n=>|B<6ACYRl26BKMbrMWo;oAa7C5`b5akN-0vOv@Iin^S zTi?h_I3smxhOp5;Gz9X&*AX_70pDSaVrlGYO$O%ePTn3toWujfr#L*ht6$jgG0YAu zrEWm13H$AHo8BkYrw^VKItnfYZ#+92Rhip4-PBONS)@MqnRM7m%<=a-o1(hG`+GjK zH&7cs|Fg4(h(7g_JmI%jQR}TBr)(d~Q%m+Qgm=CCs}XP3Ys~w{pAs{&pEZy3n?>XU z$75F;vKn5~07=ii4aGeFt{A7?5)qWH-BcBY$KBeKBIy-Kj5#6pUQE_*lcEIE{t`ic zVlvz7@H7@zmhx8S&r5}gP83vx=3K?Nxnl^?CzAF)-|N}Q+50bECehB6(E{Z1Zz|0R zHN{M>q0R(HHLyjJgTMXB!TD}`2GwL_YzF?#MRgvGWCH%xD2U~jC(t4U%HJzkD$o9c zPCJ?30&K~X{d&P)VH2NczEpeI7&h{WIr?k`@L*u-WwWhf^oyW;>3Sm|sbkJnm(suoj=YJ|Ry+l^eC?aoN|fx@m*% zn$nngv{LtKxZRrs=jG)23XJ2KFoBg;(_eSO?HXx8;(L+g;B`Y&3hsl*jb8 zUwSCaeK+tZB+f+tuT9ROqa@+=%kZ0qhgUssmh(=`8igDl_Cn@%s{4&k2BmitY$6av zMp4)Ru?gYLPZfrH%&%~9ucGE-|8<8(=E=5_@lYt?bnM5V^BN(h~xu-A~(qOd3pySr(S~Mo2}P8Y3c^OA|sMd1*K zy*{doNL!l{o^t8C=h=xGAq2eL$fC3>x~PBp*kHXt`&|a$AT;g(hXB2q#4dZ%Z>jBd zC)yiwIM&L~{y#3ES3Q!N+Kvs#^7ChXcv>d)8BBF=Feb}(?*u_U;okdrYcELK3%ma` z)bDKl>5%TCJaW-<9$U8oh{S}}CeH6A!qSA=zj!507cz=xSU`&t8VF?$sd(+A*CXENhSU0ACop~VK@Ms#fY zlgG+8-1d3lgt(3EUoeY6o((d{1WG!cUyem?oCNUy&IvxVTso@) zCKalIfpaeHxd#!GboVPG%^m4SlhzWPe`(van`jMPVi3eL+@C#rtw<++vIbiZ)j{#< zv9dGyGsiJJugrALtM27`Z_yfF-JVEi4tWp>Y-dGXxUCdT-z){pqM^VGgpo}Ro6V~ume0#KwsGHX2UBuvs~vJipKn+gL8soR!`9_ zvnWAq#52XYRq*bS((9@cup^(cqZ09}C=bvT-F$cvpIqFncT=P$Cp5evGdMQ>xRRoc zTu2zNQXfg1tdgH{70G>D@JRsgZ2RZigt&0M1UyTj{4}Ihu+Q#ybK26l_ts<>p5F(~ zdc=c-=IPhv*p$K|zs0E6UEv$uLr4vQADpmvQiHpX`{c;Abt|n2lpnW?&stzp)+0zU(x6V6q>_;p%PgUMw)7^fDNNQY*a)gBCI3ALv!%n6=g z^Ks!bt&`=algxabe)2j?;@~L2d?liVCYGk(;afU>!+JBi;t~A`A{0dn{DG)rpsWu7 zTVE?%;^ZBupSDNU+05Z&sj}$r`tM_o?%2V`DbEkoHp(r-G+j<%b_ z5)YonJv`wQ<8aVJX}{7&1@nsWEqWXM!*iB9;~+_i*z3KSrE40z*)wda#VRJ0&!WJP znCKA7M1MS$c|Zw~({lQCS;z@r8o`DiWq$GMy3)o(!^BsmG1r}eHO-#Dxcnb>u#j!{ z$LDg-8OQvCx_fhWdB8^v>WYH5=Ki@JeQ6i)5%q=MglYJ^2OUaS;?mBgN|6N|@BMRO z=iU<5mQ0D zo1(IT1*WyuF20wqD_3c$w(n>Q1e7BxYqn>V%ZD&@a)m1Z3-@l}#$SZ16@y@{s z`FP%$jUk>iNM*b~39kd9$yhBAIua%~E>bjdBd+79EZn&qMKXbsJ(^sJv^TFSO7i;A3=k@k=Pk)e8Q@_vN zhiG%qrtVP12W|;_vA#Vba*tUL6yWYqsWM*xGf}j$&c0G2Y2Sz$I}I$q9|aQh7X^=pyj)Dn zalhc~+=Fj%R*MHD~7cpYM+U zXKTh1_m&T`lqUC4@@Mnq;-?aNY-Q?W`?xmSa zUysYTPH9b=72%*e^b(2W6S(8mr$dWOnWD};?MQ0eq(%C2tZjb?%afY45wRP34+@yRJ}gBLqLtR4-(#Ng2pHXvyz!Qy6JKaK2xCURRRc zk*FEA@1tgRxnCCXs1XD-56H8t!B-LflD4q{BWAVp-c63vijrK1es+Px_4&iYbMpUM zIj6%A4PPBvupBgp{Ws57BZ7|WG|&Na?7tptnIX$QTn~3v)~GGhevGmgmvm#j`oNfN_fu{T|ku#Bwvs`pNs@gF+~{uhr=6FIP({vfoCruk|rI zEaCDBD3A^%(taFrgCB?l<<~*PZ1iRM;A?iwo#^wj_Xlf3F0BR-qbB1{1r zd{7q90yk^j@fAzLr59gJMtWuXX6O>GglL}I51m^>NMFoRgx=k4xJz+XG?^L9DD}p7 z9tm6g{c-FbuE+c%ir04M_XnT;_i5hlA6FoUkLpO>ny$z@AjEgGY^2(_U|7OA-B}yF`2@kffxO2;5JQoTU9}JL}O-L|mq4w?ukH>y?-(>f8h` zTclra$)oAFV1(mbo#?=UaMKnuUqX!;Y;+T3FP5;1N2@l^a~@em@@yvTzSHvGPk0hH z$Mr?zJ4J4dZ6IZ$LA03p-vP@Lc)HQeqsK184F~fsGcsO&>bwFDbL_^6y=Xh4Vb|SrpmqQ|KCtVNY27@wNFL{|?lNu$~9SENG%0{|0ZQ(=bKa~VwrR!vNPPl6_ zcM)Hy+m`e5RBIW}8Ci#^)90ifT-nSp&D;Y;wY0(4>$dm83aP%&y+dFA9>@6qPRIV9 z@~)flZo_Otl*ne{MdRo}`{tsSZ~G5JU+xCuD6i+SnVB#zGY323Xdh1gq>_<`+O)C= zszKT`G%Wa?j0aM0P2eh~TNG#vMe^y%lcs}TBUngl{ilWCl>pq9t)O=l>?~NFg>8{2I>#RlTmF*VMR<06jl0i~38F1EB5A*hj9Ut`qZOKc20b54&-NcE!M z2?f^tP+6F3Z4L--T5~62UaKt8MzM>Wj()=pmG*wmOqveL*|3x;X|(OD;Ko;ogq)L~ zw1*c-COmAnVch^0E{1ofTSgELX8Q#mZ|<3&OUsTd8QWd!hv9DZbXA zw_Gn={Q008pUrOlcQSk}47)xl%6Wl4?qVnvs0OPXPeP7LeKQWGOn8}x;I>m?wX`b$ zyAUMv^l3~%`pe3`iqr2S6&sTr_fVI)W&yVWPjsIbUI<2AE9cS|)5>>dsS&A9SqwL2 zb$s*erhKP49FfYr19;WjW3c7BYse@-r-!ODs{DuE1a+hR6AgeYt|Q!D)_+Bt;XT*! zyNiI^D8-X#y4r0V@VymPF3Y%C`5bBmJ z%v4M?umag$ctF&>*PFImR>SrS_;6j?L*MSVk|E8=6V_fz2MJ_|3>8EOkKmlj$Y~h& zopD5TQi{5x$V6l!Rsy7$ye|yW5fw9*>=Uc~cmd9$-14hN?-OI!)sp1>NIk{&Zm+u3 z=rp~d(X-?5U_<0v#$4EL8GgZAKmaF3tx2k4J8|*#?J(Od+jc#@d*1x9>iT=17kUrn zjV}WWUawDmuc4t2Jg+t+!Habsy}-emmU_=_Qja9?FKM3i+h=skKHhHko=+OP&>rm-j9Q<`Cvh!d%A#|V62F|KC_uSoqvC9;x!pzV=i`VJG$UPgiaIq1<9@gXUn;gEN{z^P6v)@u7<-Q8 zgcfmCm8j)H+%?sE5Knds%&b7)4e*+6JnqTC$)`q|TdOv??qn#j zDJ+F_+?YM2nwI4fR7-R27Kmhp^^3G3jjSK-4A)PFqSkq#XDsaRbyDzCw`Vgnrgopm}uMgo7-oN$3r$pDimBDeQ_RXQt$>TIW}Px|`bO5&J)y zLQXe19QVAJUSS9^LGvo<@vLuSxhp(Jr+3JI8F>iQFK`@5#_G+BruEZ036{#Ga%7^Pe0^n>%46c!CR!o6-o0Uj zHj9|plDCjvBR?USz4C}X6Lv?*5&4syiM=>~1Un7>*!Qyx>$&u3LU4{o(I zlk=;TlY{w-DnCcB%04=DXM89dPRV7QE$smvfnkX@EaVWM$mS0rPWto8L);?UW#~jZ zr8)MT?Tg#$U~Ag>2g?vjQt>X_k^bKVh z^ez~LA~)5kN(##d0Mi`_c{nSbR#UPNS7yHoL6r)vz{3^jV|3l0YsnQ7<A5FCfKTyandvn_FCG^b1$pFoV5! zXV=sF@ObIv-O7ceCvmF53)vzMH01Xof%8DOOi>cYu;$X=hT)a%YizaRwiaOc(-YT| z=#Yd8->ymxvO$OD{TT2~<$0oO|HiQ4O}u&K{*+Pc&~T6#!0YbB_>O2Pc0Ow2_E{meMf zh!lAezD@juf6s9Au?i^^+X&>5^dQcbg0j^^(&h|2EQ9gS7#1dV+m0H6v&Pp}X2@c; zv(vxU29cAgD)6t=ux&IJo%6D!<*=Qg45t>&>ubs%Ej^36ieB%v8aOjJ0(q?4p8eM| z<;b(=Lk=e2*j4iK@Z_mw-zJR?87t_8{I=yha=} z|4oPVrqLlKz283{X(0rLZo8iSTnx6xFUm`@lxJeoX3iRLO`%`BebE(`Yw15R>qV|w zD0qXtCXt4pUR?9syy!RoF>}ugolO&~SCaYz$5PYdR+DoyTF)fK+re?}i1u8ptH7VWpF7n~s1XELAZ>`$uMoyhfe-F2T^eP5>k2gP@4?z?}<=B>6u{ z`__%mVVAia?~Ew+pGvp38_}9*sh1MZQ>FxEP&NHZTKN|Mwook&KvWICbVwP%mN|#o zTuuio7(3<0Jf7gDMFs62UR!fT}$yav6V**c+&d#ti%Zwdvd zt6ewC;7uVXE1ZRUj6M92zj`3|YNjPXHMMCW2O7Zz91a1Ux?5d4xQ+DE#QW;88lf68+7 ztc~D%ElG4CO7E>g_nJDs82E{^%~6+_I-h)Y|D3wXXtAJVz1j%Mz48oJDjQ}^Wbw32Yfbem zI2f#GedldqyqEGExvHK@#9I}fWUUa*5Qf?>K@A!wYEgrEa4ZWQZEbGqtBSXoxzU4G z79L!NEJif*3D;5NlC^SG74LfPF4RuhvK&K&Th^bO-GxSOwy5#_UrO5H=NXKat~bK0 zJWt1)u+{F|0?c^hbN`+??xIZYu)G6dTr1id?csfqcK-W%mnS5#6l2JI>&wo5Woknw zj;sW6TWZ{Y8$)Wdp>ZNj(E##aLe3piD8%=4jSsucxAgo>5njI#^!qk7C;~v1C9OBF zdCmZlW39EgSRBbc4fDe|4I?i|>GS>w5G~z-HtpS(!}%AmRJuzjf6k#HY?H+kb3!O% z7<`jE*15veh;{@zyE&DH49wd-@tgn2>Wjg@9Z0fzN zBGSwy1ESK8z8F@Bbj&h%u&t%^oFtg=>7X`2zR5P6h{9ouZoTjmP#Ei3yK6EfJ|B5Z zEWT@`%yvmj=+T82juysR-(ivW1(WQAM;>x!zz&UoC*tfP_voXgP)@npYC_B}?r+j- zJOAYxy$?tbg|V|$(xXf^EP@lx-MP_IrDdrVA_C<9e$SJkJ|sBO7oaJ^CS>NJl)DG$ z8PCKF2=+4=CJTn%mKQRb6A>`%xs=S?*p1opBk`haBK4=3Zdzd41Ly8!Rqg3qGKc(9 zJYo=ZlT=POag$fOt+T-haLuqj0%jU$Ipiw3>EA23h-VvpXD~0UuX8z$9I>a{rTzRD zbH91^e!gr!w}MuK3^f+HDH$og=7jd&{HVC$gS_sHENbl$RBtr9OD}bCzF#F7vm)8e zpsr~km+5?Rku1a`vF_HbWbB`x9H^T(T27v((#`!==HE|I&@PolUa{<$P4}Gabj7?@ zBzV)Z8(r*4wqsndIqq5U@cWO!$-t`nL}S)QD7@Gr4mZh1liwPW`3mes6(LB_(qx!We5fYw&s>MX zYQ|y1(wH&wx*2cR2*}>@YTIKKY&}3TVRr?nUK}8 zTihCXFd2&sTcn!tCL}mosxi_mt5x{tgFmgY?;MdsWrxC%)+ccqjJ8tABw-!*kH(c~ z*V6U$;S$~8Fe8EaSDtd9OrxOIqxBDmy@D;eoP|~^s68HrJb=A}%k$096aM{|QaLp; z5vu}MEWQ|4i?qMzlJQynNK9ju!=?ygR~OcTK8dztFjOkFC-g!ortF>2b70+WK zM zQuI3{`Bmvec1JxFoVpEDp)**e5r%|2Xuo@On><}0HuD#Z#yW#hpUhVU=ZiMzpuTP; z*>7Xj*0g=AWX3t1Xr2f?q;^OZ@O`?b1%e^-mn12c+QG>?ovtIICU4=c0NlY`9Iq@I2eh!CJJ(if29eSgB>nW>yi{qK zjg>qL4xhvl2XMt6n>`>Gbw#hxpKYbkrj)gxfCnx=k^ZF@#$2W##JP}Ab$eiLLpNh6 z+e6DY1Viai&K4yCFIA+1g37VC#yA4k_nFpgOpE>M&}Yf8;6gTar|o*M*u=|4MvCYx z6zsUP%DM@*USb?I5qXH@2(96U2u&86B^up&K)2|&bh-;x@u5)}jV#pezC2XE{f6Br zC(Aq2$^nZ1n`6YS*BbS=SmC``kOf39L0|3dKJ5Hf(iM+r(+WR5_uLX{M%-4fGs3 z)4br&pc<-E1)Y2gU2^jV|8=xgKI;!$D-5a?kfy1z!e*+?sW94N4vL!{SI}LhtP;A+V(DXJ<|IfqnN>GQ!`&59sw^7r|RL^{MS+~mwZL5J7+w3g0^qvm3q8)?U8;^g z7k23jB-%k*W@-k;%A6=b^*Pl*YZ{5lKo8h68=dQ7*h|Z4)jifwp+PW&N9kQ0X z7i*`(%-MFtA|{~w^D~@mAFwhbqEy)uW);agK=DU!A!_2^t>0Hhye;@TC_F51Wo}-6 zp{itlI(`2~n!;lXjIdP?p~O4CA>WUD#J=j${h@UwqI4kOXyNpoR;eaZEXg_mIYnhQ zdKhSdp~TB^N!s64R9luK-Z(W-yc7q+3Zgr^TD~@>j=X$fZ+yd(!L4QJ7`(FG5ND5( z^~-h_3%2Wtnp*FNDnb;?H~lDE>t-`Q6yW!4{I}i%r5$a{JC32Ac)TFLEibh znsdg%ZJk1GV(bqk8ejIDEToAJoSMASerXPM5o$T!?=dD@jhH_!A3*ELy#BfRPjp3C z;?t)O{uh{ufXni3)(autG+`V$A$gnI{-3h)v#kIB0}~tfN>BSJDz3XY&z^kb(&9V~ z`go93qI~pYpVM&tERCwPhZ(}n1}(WkPUg(!rAI2f&^u`YT#VBnjdwlxV5g7C`(|e) z)J|hQEEhQew*0a*EL}CoC=_qIS38pv`bDFam()&T45QCTXt zcb@@U@Fy6@jvT+MKgR`+cd4HHtl%(+O^s*#{3<1FEr_26!2VZwg$P)YPSivBP-c5h zDK!KDxf4R^wCR)YqScGEBt8rjOk=0=TiO%j-K|ePv@}O=^(z`iS7Nz67B&VF^y%L=0VtBeaq6my&qDJhk#i!vUY5;;) zQx#Y?mY>~R^DAg(m1Uig@L;qkb{>_|vJkVOv+EBjDG(LkGLEOyU`i}T3!tuTos)^z z<_(3JypjQcNYF@rTuIn?4+p(I`+ap508pT3jd)n2a4rUA3GfN8*f7cx5h>M-JVdqC zFgwbRW-Cts{kxcjFYwEbdj=s>9Re9@s`7VqZ+v)lc%w%(po;sI&=Uvd*&DieO_59dDa#?*e5&%O!H?mQ1+paG(6{f6 zkY#9oKL^jEi==1=|L&1$@4UO%2ThufiaqqWJxxj6oEI{6I__t#fak2$6p3Rnc)8*& z#9+X-IqyzPjuVVSdc!wVEr&m-KgIqS4LpA@Eo?`sS^`(30S(hzWP|F&rM1+UgH0Qb z{i~OZA_~s)T4IDgrc?RH)Ps@9z>*K>M+F!EsFJ8j^m$nS1ka7!3z%uDuao+wSy=n5 z0Vt&B0IAWMbi>TyXaG)Qkw|7a%eo)dZ#7aPFHs_Zm2(^~;R)8DoOD?1byvGE|CZgH z#jBgQKC7C68yhe=)TcvG(AQRx(US&L$3#w`g?$@K3UZZS2snz zVu$?RtC8UjGlTZs-I2Rp$GHr!-%Zt>L_g%`Lh2w8pV;S)H?AM%Df#$h@(s3}rE0tf zD1$&IekMFqA}kka%J1lLLr8xkj5!=M=0}sBRW#f7LZOQRCv;JY!u<~gSwCI1 zkb%gp84onOx^~7U(;gHN7ZiJKWRp=_`Em?&%Czb!QgJ=c7W=`wd15hyS~1_hZJNWV zp1C^SV@+G@&(y-njOP>heHdpg%`~UV8@Ea^9&?H`3}Rn^S|}>(Bf$3OH25eoT}0<; zaGQKy^Ym9Yz6TJO42N%}CT3szTODPh?jvwa1_j*fJIv=ctz2%86wMy|fS#(l8j0eL zrL9QJOG%D5R@Ra@qc5hVg0)O$U7=R^0DEz&e{HqJTTgSeDj>Id%IrP}x&P!a+@0cOluW0p*~PvB zyz*FeN-xiG3UODa1=5oMmMOZulIP!6r#=w+(%+;R6P`h52axrYgaBk4dvaAgC7oDN z=c5aT4MEV_p5Q{h_U&dZ#YSm}9zY1}IR*{uPYSej2rjh^IDg-d(Ied9Caly^1ZN#+K;rg+v;)k4ta#~MJJBf2&`$&2vHQ3zQ zy!Fe)g9+l+_H1j7x}bCai-g?#!*@L#S;x#xWz;)p+2`&~r}udy)$*%S?+dyJyH@4@ z0mDVwvN>wdu*7S8*}VJ{>FlaWrYW;^RSSVZO9d@8=qJJJvq971eAlDE-E5g}|It}4 zJFM_9UXs8UeCrNB<+%7}Z-ZuiLiA5OsO5&QsOlnx<_wE2?%Hy#jhnRQ!0r_7KJ<%VJ~TR$$uBgSTl=04oRj(Q5cdcW7@=xLhh~>5iFyk*r5agVo6A+3etl zfl0$B;R_im$0^Q7onqPX}hxpJtC{0ZD zSKGR2#)ta<(vz&E!@&Er`?q8}xYt@}Mx&vF@$#w_hpk?ic9`e;kkUQ2wBpKs;Mf(B z!7+!-YNEAr&mJs%^?Eq}O3sUDS(Yjp9T$b6`#e20(0 zYMAXfIm%?CzyuXE7hVtsP_hVomv)#aQ%eMY$i%DQg9zsIX z++w51VQz?{gy7`78$WJ~D2_J7Z*Z?wM)?+)U?2LuR;-eA{?IsPG*{h3dLM|ci}KxY z9!{fLNfM^Np|-1KXZS5!XG#<->^;i-#R8n1|AdlWX{N;5uP6}kgARgH5OXv*9oTD} z73Z@%R830gVyT1I{(hXhmMulS14&=e!+sPpdXq&az;mn@$W|>ReYSM$q(t&q!nZCma*vaE_ z-_t_Yr#Qj^D*_)p>8lyXVRq9^|1I(NAKzCY*L*wD##;=6mgt*h*eOhRP^5bh`me!* z9L9w25>Ncb0TZ{OZ|D$v5G_kMIp4svf9t60EyibI3o~c_*aMLR{~jj$7+5LNdiT{4 zjWVI!z|Aw}DC2oQn^kd~>x7B*T*Df2vd%R|>}--*$Ybwp5RIH0{?lq-KRu?Ug`xw{ z(RJSf(BlWR7)QTZqgY=|(8*{qI4aX?-dSg1cj{x^j20dIq7Gou;sT^J>PIF$aP;B4 zUkImDOqEBm6^nYUgB_QCEvi9zj%oUAkEq z2mdjaNw5ZO_PpoM_1F}N$5=`RZ@PMjW;xH%r~(WjCB ztTzLeQZDWrc?h9vHm)tHY)WI&#m1FRV;%i!*INA{T?zZmGLQsH9zNfX^z|Uc#6IDc z{OyY1xA)u1fX8TZgpc&ANPJCZ>uQKak6)Pf6aoF(pTu*vd@vhxzpb(XD-Xl-=X#O; zA=u(Y5A%1{LOht2Ie4kRe|l@&!R=R=?lLThDCueW23!=@eKT~( zr9AHFvjbL;Tn>`?VPrS`QfCi!naT`z}1jI!sHwMMXJ)gt&#g!c$~4_qAUD+QUXdmeJ_}pU!D?KaN-; zg}T&$N=PY-?_@a7_AKzloM&acKv(cmW%h$*Od~Zwv!tl~A>BNE_9QQCzA$Rcr)3LjZ`*h&Ibnf&)0X*fe?Gdvin5T9OLP{+Mkg?)s{%e7MRK8YP~(_qOfdZ=40X4hWbZUi}oA*Tr@(Y z&uXJc=gW0-OkRgjHzB}+t-~D{nLZrE#bjTQ9vM_1T5?27)by)grH>2R`OhTK|Ad%0 zeEV9WJsUyV4BVMj80b%xZeheL<(%AYT7D~SdX0{t%|bh9ffq5}PtM9^-1MGKS2Ozd z(-OhY3fCHmIw%d^S+%DH#+F8W5B&GYdWn$nes46&owPXOSAnw9Ds z-1J|#B=3kSMsEWeOtt#F{KvVsd`uDH-q`CpvBeirmLBI%lAdLu)QO#hD{c~e>Xo|I z(LB*rRNQM_W|Q%x?2F$f9&9RW6#!8K2orLZG)_SCqu-&=7g7!Lr(0?>3e>k}+0L-f z3^m+<*kQd9rsGDOd87aJuhH#WlF-%Hrh%6g+8g?KhM0(Lb-xX-8?|<%`}}#h?8{#w zt^UOlx@8d5T|%-%xmA* zpYLm@=hNoWtQ1|SA$AM7pv$7CXIOZs4zD;RD&E)&+1;*3OCUC)%1fZvh}rpi`m^pCw z@6W2UNx5ajotI#Rpkhm$GlXD%DOC6aEytV%y70W&ckl1(0p}Y78pVb*^{p$TXHiZ; zk9^#Tn1Wd=yd&%dNXR+Ahq@X0aA)8^$*~GTS zS$T9I5?Xfy=M9c>DlDEN6|##|KYJuh>c5oG)u^IyRKHyZslDtG(hD*_XPfx;(8pL%hpP{A~OLBQR!fmr$N|3{yC8JQ`7NLnP&0cbHka#F^3Vk>9KKd*3)Bk*r zl%y{~SN{*QnR0)jwTvQNH)rp9c4+y3oqv>(rfGU zI4HSW+dRaw%+-=&uBbijbMCF6HI`$IZYsA~YmSpS`%P{%d7kTV?|kN#PZXZ(_xYCJ zcD(-4-B6lEc09;am|o_roy_eeV1nWpVyfTx^_`J754jaYWKqPTDD)aT4EI?0c`7$P zIETk62#akB^*EaK&`an?(s_k3zBlR~Gbv%dPJhq*vtcEmg8pHRrTJ4j(v{awUzEE4 zD>ZT*;KS4ba6`4BWLVy;^4Z-Pqs~M)NEEF{!WIXoI-u9Wl;$yB>76;ck1GJ3u zR?Zo9ctJU=P)74kf4Mt4BL5He-aDEN`2YV+P@^`jQ6shvYPHmem_;d7R9hnyMF~}V zgeWa)B=#0HiVl0!rnUF1J!-GmLPFxEpWi*_et*Av?_c+xbIc@96jS}3g#mA#|#-R7W z!(Uiai_8i~Eb}S6Sx4^JNP{__}@q0 z2lY&FZ?fVacylItDhlR=5Iy45HYYnx70c?KADzF^wX40Gc@`p(llI_NY`awGWD`ZX zV2ZwQUh8j|UH6cCky|F{ub^tv%@Z+Y0WJ>KEfcPdAIj_z9GSOAXWA%xaPoi9cABp~ z@ads3ay&8;W%u19L6Wa%*NY4kU_2*;sXcO!$)vMrX{K%N16I7xpLi`uX)Jb|$A-&9 z?&vwuM1GB1=(-S_VK;M<(%OsFaQhLxPx%(dZZ7ZoMuK)?&%$^c`iL?+8B`(Y17t5EOoUZSK z;7GuXbj7>|o1x_nLDPf1SHSd#PXp{_vT*E*+woH!o#OKjTwM2R49ZF)6f^%v=QcsG z$wS&95guTK}|rq@6-^CMjd%Ukw$J$wf1ln*P#EymPqf;K_GGBSUl^~TLc;8V>w zj5AgDc1xrOc_jl@jm|?rZIPP^CMn9tzW+sdp{KOao~G^Ce_Ps8BK&o2xu z!<#%p>60ks5k4;z(>>sYM(D6U#>lQ5b#LZF z@h5HeP{qkEmR?)0s@oqN@9v0r+GhLvO&Gke#(># zussIm0NXY+H#&zysCML>J4L8jw8@f9L0J>e6D*xS^C0Q{l&XRKB5qhuX#m$lOlV=Y z_%tvj_eh?C@TT`jE6zdn;akvB}-z(m@cT z@^Somx^V^Mp6CH5!LWXQebW)AvZ>9SJKM~ZgstfTf!}E>sA~^rMeuJ{7$}LpvWd03 z&-gVUKM_0+iSds(@A1kP$D6dh2xv)u##zB6ys3B^9uvh{XZ(i{D+yg9-9*m|sGs9M zMh|{-nG35fs4;wXx#X08Eg9djyn`l0)T;XJkUcRAXgt-3AxOaH-=-;2t$YP&2&x8wD zh_$KWa1t4ub4Blexdncg2%fDsRaqVSj6Lj?@Mn~yCW$Md4L%3wcY`miNEs(mPrY*b z0fxHRkwiLn@tmm){QBeNL19EO47}CLH8be!U}o&HJUz`yC+!>^Atum#bGd(C?(w-F zsgP0Kn?7f-{j&_*Xcu`Z*)1`Rvj^)wI5ub`zBnzJ4!?HXp5^dVnhlu2R%JC1)roKT~<7G?d0@W{V2O6{W+D-~pt_swoYz@x@7(8MYWH z(0vz*sRJM$Aywm#Z_ud)cr20(cGADV2nU3f^ZkP_4FYgIwnF-1l2bIqp@*!Jb&g__ z`3ap$E@UMP(1JB5XBbZH$^$$hH=+ssm}|vA^W+=1ET#F?Q1zI?m6JL?c5Zr zXyCn4yC`GOr3sg3-vginc?=q?VmAB%v=K=|TSd~Tl353ZQ%tQLfN*)_fq1?kBTB-R zKV|Z5(HGzEtr->L<|uH@ z;_@G7oKvjSOON@N#krc!_p1i0zFTwrp>{^+S_CEm`es)Rb;c_J zRrz!f)xu_>_~;42L)r07r0i@^yhBv#^iXVdK#9&x^?QQV(|32>$5lnWz`5?n&!8My zS)ya$uE}Hj#P#ZF;mo=OuFZr5aH_ur{z4@M9j*h;AEk0$Ni{sZs$8YK=?y6ZHgC%( zAfYP8Ph;dW)^8C>aU1fLZwwQYy-F)D{2b)mMNgSLEer@b80ta2lMnJCP>(j{p3hXb zW*k6`r0iGIZsYBBuR4Z~*;9$Yait1yV+l7QYhzhI4SkvBt&x4eFg;2mDS%$CNND}| z=oI;YU}2|9l~et5ZLV9v1YP2* z;AS!%ipf|(Ej{V7VzOb$=zsVpfq3YJiAzUms(t)m3ykn z<*`}w7L68M7}gVO$z+)zgS+1^-L(Vin1?nc@oGyHGi!ywwxFRx)4h4mNO?rTs9d>U zrZ*^(lifF{nYxI=8mLXQPm<3~di;a7GtvEgUAH>H6Jg;_*_JZdEWn#go6?oCSPVDqh+uq68_c$k|2};`#rQ>t3c$PsL?(oovl_yD zJXTSgzP=wxpbj43K5mW--PxQQd%=YFZCO-jMs7 zZ^l*|@nBO7oo>FAD)qS1GI)kS)-GaaT#Us@4d(_RVKFOv~ZfBgUhTNApmCYqX-*C}hp(BD?NQ0X6UOFnfzK zCOPxCKhVv;@{XcMbYOv}l$0n)rHhGEV}b8nZ|7z-k)`ZD?*-zo24f!DK zhm$vALMY|QUEd}%yOiw>lX}kc%#r*9Ow*^vv~75?Uz8{2{1N`^-dS;%0IMdJ{Zs{S zPHf%n#x3F6<>9|vc=#pMUZS*k)?ThPuSem#ebSFxy-6wD`YrVq|sz7rp1QG({|IX#Na_0**5wY14yd!Gg8 zb+1X6UNP)EdKy^b0PTPsThq^+RxVJj_|o~v9^3PJ`88}rj---TMo0HSckRM&O zCb!TA%LKUAH7YGQ>F*1MV@7Ki6#cX?N67nrt|zDLdwC5t)nU(9Q=|U}&7ft_=f{=4hvK>+(6sH0W4h5Js9!hBi z+Q}~~NQB+1tqQbAfAKre$_N$`Bjfb^#*|KZ)3vxR$t2~twZ>+#ZJsODiS7cw^xl5} z*!&Jia$u@$e~1%HUO^u#D8mGt<6{UDJH&6*I#ODpWqIT*cbfg;sT`m6@&EfB@#|^e9!o{p z<)|yn%AR;WR%Am{`B0Ji&PB?ed~m&&z_>9ga-&rcixs&sr}=G0@bQQ8NgdyoTUxH> z#nrc*ej(t2fD4|tX<{gqW2;CSmT?(}n!A8|o)idRI}b;?&`50rDr@)Nrf@$qSRu~k z$?Z&${CzE?av2<981Nb#VfFi2G5vA9ic%_ob^q>VPH#2{ve*l*ldTtrT0@nD(vY$Nu0BnMVdX3qGV5h`+Vnf> zr|&{@lK-9Aw%Pyav&l7`qR854ERWpEgp*_q|x-!1{ALenVCr z`K3>)CM;FNeWJWmzaiM0y1DSvvL^G`MWXYV7Tq2+ZZPwSk+JvLxaNdvj)q0SU~Rb; zt_*@%Gzxe@5CVr@TW+2iOc!`9O>$N$r)~@nQ#4NBuGb-*SKB>u zVmCvF2}U|>LymCFZt3ZQM%`^ZZj4z;ED_5z?t#;^iu&UNgc<8gBZzK;F=&5Q1&^4( zo+rq48KHX<`ld}ZlAEmy)Iw~70r9b6jxu%NXSdPkqRR&I$1hx6B?j$#c1Oi1T=dY0oS~{CN3(ukja$;=l><;9Lh*ww@dzo>SjY2A}_+5e5Enx{!tG zS%<$^NtsVaSPEy9Ixxiqxr{h23d1&YU$?ytX3gp)0XiFj8_&*>lN#^s5g zX7v7Gzw_q5bw8i|?f+>`bJZX51DY(13S$J3oS&KqX5d4i$xeM1AU2q~^g1#+Ts&r; z_WK^L%8e&|sl=AF6gP9(!q+i6*^9OC1wTRele4{~!Xs8G;yyD|g1d<5g zeEA#h_;iPi71g`f_$31eB zdmGG~ziW;oD2 zz&GmLU8P(fs8QN8_%+o1-~{1WNdW!Az^-xS(~bI0GVscti-b?=m)#ee?SoDBw#&42 zgL+Sj#Fq7OeUF7!=&-&q{9kRzEF7DXF~~m8NRLvAw>vYlooCqsi5u*(c?rIjtKfy3 z>t2o$M1642L(?_kqq~F??srXFw~+qGI*}9OiNWjrZXF9Y;jXhEFK+SdCLi)WbsAXD z`pj6%9&o9x7LVlg8E zucXn@5aJkgh}R~@zW0(YC=K>cau6Tc&U(kWNzFOFtzEcGUF+9zqP&(Bj?p)*Z7}lL z)q)JZ2z2KA^estsWZ|sbdC9WlSp*68$Edfeqgc33OX%{C0=ak;d$XPrRdash&yn6- zAh_GH>E+)r(8n#F)W%p)n%CTU z_$WELB@Sn|nR4@|j{LH09Y zkXKnyKAYqXVOYQ zwZ0G))U)D0R`&z8Z`{wmy98hg4?LMrzV?9Pd4(%`tQfzm+7N(9_a%R@4Hd9x_gVuC zj5&zzNu{F*zr8mV!bHQbOc#(J$wX=>Rodz1kXdmtr5ZOaC|NmrUUczD+6kqs2F#Sn#M*--)i(CKPkMqEG*+#dqVD>k_%Od19weYTsxTd~(~TNd`Hrm330; zoNE8*;#VW+{m1o)wPV!|4Zqq`>%mv z_fcEjdE!jE6BD#~EMq$OG>Nr>dv?Wq;xF#IUyP&?r}Mtjys-a%@CXY}H#mlOXH4el zDZe`nXlGrEHS2`X)N>?vO6_@jE7oa`ep9f?7y=F?tyw2q-APJ`8L^1Ii&x6>af5{3 z3ReHEtk1j3jqBLmm0XFb&d5`aSQ~?FLVJCzlnA(uEp|u@*2kzs9FfvmO{a*Dxp*RE zA(m^LmHX9qV$0$Y1&7dosEWkJ@rkCr#>UCBEc!iB;qks7`dyn0hAaYmt0-}B3PleLpt9L(H4Cn_JQC_C^VDDv24 zj-+Yb2JQbqy<)OVf3ZYu*e)>^&;#yO2tRw@)pHWn13S)wiu^ntB<^B%?8@bP^}MLL zOLuZFx9Aao0HyxdxS8R2!tcXgUkWS0;=KpJJhBD~^YHoL2Ua*5KDun`MH?ua$Bk>J z

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%0Dj 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%0Aq{O-Z@Aw*d+3vk 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 Date: Tue, 17 Dec 2024 22:47:17 +0800 Subject: [PATCH 5/6] zy --- doc/小米便签成功截图.png | Bin 0 -> 408936 bytes src/notes/MainActivity.java | 24 + src/notes/data/Contact.java | 86 ++ src/notes/data/Notes.java | 169 ++++ src/notes/data/NotesDatabaseHelper.java | 210 ++++ src/notes/data/NotesProvider.java | 357 +++++++ src/notes/gtask/data/MetaData.java | 89 ++ src/notes/gtask/data/Node.java | 116 +++ src/notes/gtask/data/SqlData.java | 189 ++++ src/notes/gtask/data/SqlNote.java | 505 +++++++++ src/notes/gtask/data/Task.java | 351 +++++++ src/notes/gtask/data/TaskList.java | 343 +++++++ .../exception/ActionFailureException.java | 33 + .../exception/NetworkFailureException.java | 33 + src/notes/gtask/remote/GTaskASyncTask.java | 124 +++ src/notes/gtask/remote/GTaskClient.java | 585 +++++++++++ src/notes/gtask/remote/GTaskManager.java | 800 +++++++++++++++ src/notes/gtask/remote/GTaskSyncService.java | 128 +++ src/notes/model/Note.java | 253 +++++ src/notes/model/WorkingNote.java | 368 +++++++ src/notes/tool/BackupUtils.java | 344 +++++++ src/notes/tool/DataUtils.java | 295 ++++++ src/notes/tool/GTaskStringUtils.java | 113 +++ src/notes/tool/ResourceParser.java | 181 ++++ src/notes/ui/AlarmAlertActivity.java | 158 +++ src/notes/ui/AlarmInitReceiver.java | 65 ++ src/notes/ui/AlarmReceiver.java | 30 + src/notes/ui/DateTimePicker.java | 485 +++++++++ src/notes/ui/DateTimePickerDialog.java | 90 ++ src/notes/ui/DropdownMenu.java | 61 ++ src/notes/ui/FoldersListAdapter.java | 80 ++ src/notes/ui/NoteEditActivity.java | 873 ++++++++++++++++ src/notes/ui/NoteEditText.java | 217 ++++ src/notes/ui/NoteItemData.java | 224 ++++ src/notes/ui/NotesListActivity.java | 954 ++++++++++++++++++ src/notes/ui/NotesListAdapter.java | 184 ++++ src/notes/ui/NotesListItem.java | 122 +++ src/notes/ui/NotesPreferenceActivity.java | 388 +++++++ src/notes/widget/NoteWidgetProvider.java | 132 +++ src/notes/widget/NoteWidgetProvider_2x.java | 47 + src/notes/widget/NoteWidgetProvider_4x.java | 46 + 41 files changed, 9852 insertions(+) create mode 100644 doc/小米便签成功截图.png create mode 100644 src/notes/MainActivity.java create mode 100644 src/notes/data/Contact.java create mode 100644 src/notes/data/Notes.java create mode 100644 src/notes/data/NotesDatabaseHelper.java create mode 100644 src/notes/data/NotesProvider.java create mode 100644 src/notes/gtask/data/MetaData.java create mode 100644 src/notes/gtask/data/Node.java create mode 100644 src/notes/gtask/data/SqlData.java create mode 100644 src/notes/gtask/data/SqlNote.java create mode 100644 src/notes/gtask/data/Task.java create mode 100644 src/notes/gtask/data/TaskList.java create mode 100644 src/notes/gtask/exception/ActionFailureException.java create mode 100644 src/notes/gtask/exception/NetworkFailureException.java create mode 100644 src/notes/gtask/remote/GTaskASyncTask.java create mode 100644 src/notes/gtask/remote/GTaskClient.java create mode 100644 src/notes/gtask/remote/GTaskManager.java create mode 100644 src/notes/gtask/remote/GTaskSyncService.java create mode 100644 src/notes/model/Note.java create mode 100644 src/notes/model/WorkingNote.java create mode 100644 src/notes/tool/BackupUtils.java create mode 100644 src/notes/tool/DataUtils.java create mode 100644 src/notes/tool/GTaskStringUtils.java create mode 100644 src/notes/tool/ResourceParser.java create mode 100644 src/notes/ui/AlarmAlertActivity.java create mode 100644 src/notes/ui/AlarmInitReceiver.java create mode 100644 src/notes/ui/AlarmReceiver.java create mode 100644 src/notes/ui/DateTimePicker.java create mode 100644 src/notes/ui/DateTimePickerDialog.java create mode 100644 src/notes/ui/DropdownMenu.java create mode 100644 src/notes/ui/FoldersListAdapter.java create mode 100644 src/notes/ui/NoteEditActivity.java create mode 100644 src/notes/ui/NoteEditText.java create mode 100644 src/notes/ui/NoteItemData.java create mode 100644 src/notes/ui/NotesListActivity.java create mode 100644 src/notes/ui/NotesListAdapter.java create mode 100644 src/notes/ui/NotesListItem.java create mode 100644 src/notes/ui/NotesPreferenceActivity.java create mode 100644 src/notes/widget/NoteWidgetProvider.java create mode 100644 src/notes/widget/NoteWidgetProvider_2x.java create mode 100644 src/notes/widget/NoteWidgetProvider_4x.java diff --git a/doc/小米便签成功截图.png b/doc/小米便签成功截图.png new file mode 100644 index 0000000000000000000000000000000000000000..6be1e6c70e93165487dbc494bcd2c3e8247d423c GIT binary patch literal 408936 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�JeLwkB3dW_P}Z&FVe`Uiml%9Asqh(m9=WZi!6NP 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
LesqD|G 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�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 z

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%0Dj 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%0Aq{O-Z@Aw*d+3vk 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 { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/src/notes/data/Contact.java b/src/notes/data/Contact.java new file mode 100644 index 0000000..b658581 --- /dev/null +++ b/src/notes/data/Contact.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.content.Context; +import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Data; +import android.telephony.PhoneNumberUtils; +import android.util.Log; + +import java.util.HashMap; + +// Contact类用于获取与电话号码关联的联系人姓名 +public class Contact { + // 缓存已查询的电话号码和对应的联系人姓名 + private static HashMap sContactCache; + // 日志标签,用于调试和错误日志 + private static final String TAG = "Contact"; + + // 用于查询联系人的SQL选择语句,其中"+"将被替换为电话号码的最小匹配值 + private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + + "(SELECT raw_contact_id " + + " FROM phone_lookup" + + " WHERE min_match = '+')"; + + // 根据电话号码获取联系人姓名的方法 + public static String getContact(Context context, String phoneNumber) { + // 如果缓存为空,则初始化缓存 + if(sContactCache == null) { + sContactCache = new HashMap(); + } + + // 如果缓存中已存在该电话号码对应的联系人姓名,则直接返回 + if(sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber); + } + + // 替换SQL选择语句中的"+"为电话号码的最小匹配值 + String selection = CALLER_ID_SELECTION.replace("+", + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // 查询联系人数据 + Cursor cursor = context.getContentResolver().query( + Data.CONTENT_URI, + new String [] { Phone.DISPLAY_NAME }, // 查询联系人姓名 + selection, + new String[] { phoneNumber }, // 查询条件为电话号码 + null); + + // 如果查询结果不为空且能够移动到第一条记录,则获取联系人姓名 + if (cursor != null && cursor.moveToFirst()) { + try { + String name = cursor.getString(0); // 获取联系人姓名 + sContactCache.put(phoneNumber, name); // 将结果存入缓存 + return name; + } catch (IndexOutOfBoundsException e) { + // 如果发生异常,记录错误日志并返回null + Log.e(TAG, " Cursor get string error " + e.toString()); + return null; + } finally { + cursor.close(); // 关闭游标释放资源 + } + } else { + // 如果没有找到匹配的联系人,记录调试信息并返回null + Log.d(TAG, "No contact matched with number:" + phoneNumber); + return null; + } + } +} + diff --git a/src/notes/data/Notes.java b/src/notes/data/Notes.java new file mode 100644 index 0000000..53ca199 --- /dev/null +++ b/src/notes/data/Notes.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.net.Uri; + +// Notes类,用于定义笔记应用中的常量和接口 +public class Notes { + // 内容提供者的Authority + public static final String AUTHORITY = "micode_notes"; + // 日志标签 + public static final String TAG = "Notes"; + + // 笔记类型常量 + public static final int TYPE_NOTE = 0; // 普通笔记 + public static final int TYPE_FOLDER = 1; // 文件夹 + public static final int TYPE_SYSTEM = 2; // 系统文件夹 + + // 系统文件夹ID常量 + public static final int ID_ROOT_FOLDER = 0; // 根文件夹 + public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹,用于存放不属于任何文件夹的笔记 + public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹 + public static final int ID_TRASH_FOLER = -3; // 垃圾箱文件夹 + + // Intent额外的键 + public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; // 提醒日期 + public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; // 背景颜色ID + public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; // 小部件ID + public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; // 小部件类型 + public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; // 文件夹ID + public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; // 通话日期 + + // 小部件类型常量 + public static final int TYPE_WIDGET_INVALIDE = -1; // 无效小部件 + public static final int TYPE_WIDGET_2X = 0; // 2x小部件 + public static final int TYPE_WIDGET_4X = 1; // 4x小部件 + + // 数据常量类 + public static class DataConstants { + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 文本笔记 + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话记录笔记 + } + + // 查询所有笔记和文件夹的Uri + public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); + + // 查询数据的Uri + public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + + // 笔记列接口 + public interface NoteColumns { + // 唯一ID + public static final String ID = "_id"; + + // 父级ID + public static final String PARENT_ID = "parent_id"; + + // 创建日期 + public static final String CREATED_DATE = "created_date"; + + // 最后修改日期 + public static final String MODIFIED_DATE = "modified_date"; + + // 提醒日期 + public static final String ALERTED_DATE = "alert_date"; + + // 文件夹名称或笔记文本内容 + public static final String SNIPPET = "snippet"; + + // 笔记小部件ID + public static final String WIDGET_ID = "widget_id"; + + // 笔记小部件类型 + public static final String WIDGET_TYPE = "widget_type"; + + // 笔记背景颜色ID + public static final String BG_COLOR_ID = "bg_color_id"; + + // 笔记是否有附件 + public static final String HAS_ATTACHMENT = "has_attachment"; + + // 文件夹中的笔记数量 + public static final String NOTES_COUNT = "notes_count"; + + // 文件类型:文件夹或笔记 + public static final String TYPE = "type"; + + // 最后同步ID + public static final String SYNC_ID = "sync_id"; + + // 本地修改标志 + public static final String LOCAL_MODIFIED = "local_modified"; + + // 移动到临时文件夹前的原始父ID列 + public static final String ORIGIN_PARENT_ID = "origin_parent_id"; + // GTask ID列 + public static final String GTASK_ID = "gtask_id"; + // 版本号列 + public static final String VERSION = "version"; + } + + // 数据列接口,定义了数据表的列名和类型 + public interface DataColumns { + // 唯一ID列 + public static final String ID = "_id"; + // MIME类型列 + public static final String MIME_TYPE = "mime_type"; + // 笔记ID列 + public static final String NOTE_ID = "note_id"; + // 创建日期列 + public static final String CREATED_DATE = "created_date"; + // 最后修改日期列 + public static final String MODIFIED_DATE = "modified_date"; + // 数据的内容 + public static final String CONTENT = "content"; + // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 + public static final String DATA1 = "data1"; + // 通用数据列,具体含义取决于MIME类型,用于整型数据类型 + public static final String DATA2 = "data2"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA3 = "data3"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA4 = "data4"; + // 通用数据列,具体含义取决于MIME类型,用于文本数据类型 + public static final String DATA5 = "data5"; + } + + // TextNote类实现了DataColumns接口,定义了文本笔记的相关常量 + public static final class TextNote implements DataColumns { + // 模式,用于指示文本是否处于复选框列表模式 + public static final String MODE = DATA1; + // 复选框列表模式常量 + public static final int MODE_CHECK_LIST = 1; + // 内容类型常量,用于目录 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; + // 内容项类型常量,用于单个项目 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; + // 内容URI,用于访问文本笔记的数据 + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); + } + + // CallNote类实现了DataColumns接口,定义了通话笔记的相关常量 + public static final class CallNote implements DataColumns { + // 通话日期列 + public static final String CALL_DATE = DATA1; + // 电话号码列 + public static final String PHONE_NUMBER = DATA3; + // 内容类型常量,用于目录 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; + // 内容项类型常量,用于单个项目 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; + // 内容URI,用于访问通话笔记的数据 + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); + } +} diff --git a/src/notes/data/NotesDatabaseHelper.java b/src/notes/data/NotesDatabaseHelper.java new file mode 100644 index 0000000..d380033 --- /dev/null +++ b/src/notes/data/NotesDatabaseHelper.java @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + +import android.content.ContentValues; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; + + +// NotesDatabaseHelper类扩展了SQLiteOpenHelper,用于管理数据库的创建和版本管理 +public class NotesDatabaseHelper extends SQLiteOpenHelper { + // 数据库文件名 + private static final String DB_NAME = "note.db"; + // 数据库版本号 + private static final int DB_VERSION = 4; + + // TABLE接口定义了数据库中的表名常量 + public interface TABLE { + public static final String NOTE = "note"; // 笔记表 + public static final String DATA = "data"; // 数据表 + } + + // 日志标签,用于调试和错误日志 + private static final String TAG = "NotesDatabaseHelper"; + + // 单例模式的数据库助手实例 + private static NotesDatabaseHelper mInstance; + + // 创建笔记表的SQL语句 + private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(...)"; + // 创建数据表的SQL语句 + private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(...)"; + // 创建数据表上笔记ID索引的SQL语句 + private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + TABLE.DATA + "(...);"; + + // 定义了多个触发器,用于在笔记表和数据表上的操作后自动更新相关数据 + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER increase_folder_count_on_update ..."; + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_update ..."; + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = "CREATE TRIGGER increase_folder_count_on_insert ..."; + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = "CREATE TRIGGER decrease_folder_count_on_delete ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update ..."; + private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete ..."; + private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = "CREATE TRIGGER delete_data_on_delete ..."; + private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = "CREATE TRIGGER folder_delete_notes_on_delete ..."; + private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = "CREATE TRIGGER folder_move_notes_on_trash ..."; + + // 构造函数,初始化数据库助手 + public NotesDatabaseHelper(Context context) { + super(context, DB_NAME, null, DB_VERSION); + } + + // 创建笔记表及其触发器 + public void createNoteTable(SQLiteDatabase db) { + db.execSQL(CREATE_NOTE_TABLE_SQL); + reCreateNoteTableTriggers(db); + createSystemFolder(db); + Log.d(TAG, "note table has been created"); + } + + // 重新创建笔记表的触发器 + private void reCreateNoteTableTriggers(SQLiteDatabase db) { + // 删除旧的触发器 + db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); + // ... 其他触发器删除代码 ... + // 创建新的触发器 + db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); + // ... 其他触发器创建代码 ... + } + + // 创建系统文件夹 + private void createSystemFolder(SQLiteDatabase db) { + ContentValues values = new ContentValues(); + // 创建通话记录文件夹 + values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); + // ... 其他系统文件夹创建代码 ... + } + + // 创建数据表及其触发器 + public void createDataTable(SQLiteDatabase db) { + db.execSQL(CREATE_DATA_TABLE_SQL); + reCreateDataTableTriggers(db); + db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); + Log.d(TAG, "data table has been created"); + } + + // 重新创建数据表的触发器,删除旧的触发器并创建新的触发器 + private void reCreateDataTableTriggers(SQLiteDatabase db) { + // 删除如果存在的话,插入数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); + // 删除如果存在的话,更新数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); + // 删除如果存在的话,删除数据时更新笔记内容的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); + + // 创建新的触发器,用于在插入数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); + // 创建新的触发器,用于在更新数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); + // 创建新的触发器,用于在删除数据时更新笔记内容 + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); + } + + // 获取NotesDatabaseHelper的单例实例 + static synchronized NotesDatabaseHelper getInstance(Context context) { + // 如果单例实例为空,则创建一个新的实例 + if (mInstance == null) { + mInstance = new NotesDatabaseHelper(context); + } + // 返回单例实例 + return mInstance; + } + + // 当数据库被创建时调用此方法 + @Override + public void onCreate(SQLiteDatabase db) { + // 创建笔记表和数据表 + createNoteTable(db); + createDataTable(db); + } + + // 当数据库需要升级时调用此方法 + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + boolean reCreateTriggers = false; // 标记是否需要重新创建触发器 + boolean skipV2 = false; // 标记是否跳过版本2的升级 + + // 如果当前版本是1,则升级到版本2 + if (oldVersion == 1) { + upgradeToV2(db); + skipV2 = true; // 包含从版本2到版本3的升级 + oldVersion++; + } + + // 如果当前版本是2且没有跳过版本2的升级,则升级到版本3 + if (oldVersion == 2 && !skipV2) { + upgradeToV3(db); + reCreateTriggers = true; // 需要重新创建触发器 + oldVersion++; + } + + // 如果当前版本是3,则升级到版本4 + if (oldVersion == 3) { + upgradeToV4(db); + oldVersion++; + } + + // 如果需要重新创建触发器,则执行相关操作 + if (reCreateTriggers) { + reCreateNoteTableTriggers(db); + reCreateDataTableTriggers(db); + } + + // 如果版本号不匹配,抛出异常 + if (oldVersion != newVersion) { + throw new IllegalStateException("Upgrade notes database to version " + newVersion + " fails"); + } + } + + // 升级数据库到版本2 + private void upgradeToV2(SQLiteDatabase db) { + // 删除旧的笔记表和数据表 + db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); + // 创建新的笔记表和数据表 + createNoteTable(db); + createDataTable(db); + } + + // 升级数据库到版本3 + private void upgradeToV3(SQLiteDatabase db) { + // 删除不再使用的触发器 + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); + // 添加用于GTasks的ID列 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''"); + // 添加垃圾文件夹 + ContentValues values = new ContentValues(); + values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + } + + // 升级数据库到版本4 + private void upgradeToV4(SQLiteDatabase db) { + // 添加版本号列 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); + } +} \ No newline at end of file diff --git a/src/notes/data/NotesProvider.java b/src/notes/data/NotesProvider.java new file mode 100644 index 0000000..fe82f49 --- /dev/null +++ b/src/notes/data/NotesProvider.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.data; + + +import android.app.SearchManager; +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Intent; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; + + +// NotesProvider类继承自ContentProvider,用于提供对笔记数据的访问 +public class NotesProvider extends ContentProvider { + private static final UriMatcher mMatcher; // 用于匹配Uri的UriMatcher + private NotesDatabaseHelper mHelper; // 数据库帮助类实例 + + private static final String TAG = "NotesProvider"; // 日志标签 + + // 定义Uri匹配的常量 + private static final int URI_NOTE = 1; + private static final int URI_NOTE_ITEM = 2; + private static final int URI_DATA = 3; + private static final int URI_DATA_ITEM = 4; + private static final int URI_SEARCH = 5; + private static final int URI_SEARCH_SUGGEST = 6; + + static { + // 初始化UriMatcher并添加Uri匹配规则 + mMatcher = new UriMatcher(UriMatcher.NO_MATCH); + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); + } + + // 定义用于搜索结果的投影,去除换行符并格式化输出 + private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," + + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," + + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + + // 定义搜索查询的SQL语句 + private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + + // ContentProvider创建时调用 + @Override + public boolean onCreate() { + mHelper = NotesDatabaseHelper.getInstance(getContext()); // 获取数据库帮助类的实例 + return true; + } + + // 实现ContentProvider的query方法,用于查询数据 + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + Cursor c = null; // 初始化Cursor对象 + SQLiteDatabase db = mHelper.getReadableDatabase(); // 获取可读数据库实例 + String id = null; // 初始化ID变量,用于存储URI中的ID + + // 根据URI匹配结果执行不同的查询操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,查询笔记表 + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID并查询该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); + break; + case URI_DATA: + // 如果URI匹配到数据列表,查询数据表 + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, sortOrder); + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并查询该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + parseSelection(selection), + selectionArgs, null, null, sortOrder); + break; + case URI_SEARCH: + case URI_SEARCH_SUGGEST: + // 如果URI匹配到搜索或搜索建议,执行搜索查询 + if (sortOrder != null || projection != null) { + // 如果提供了排序或投影参数,抛出异常,因为这些参数不应该用于搜索查询 + throw new IllegalArgumentException( + "do not specify sortOrder, selection, selectionArgs, or projection with this query"); + } + + // 获取搜索字符串 + String searchString = null; + if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { + // 如果是搜索建议,从URI中获取搜索字符串 + if (uri.getPathSegments().size() > 1) { + searchString = uri.getPathSegments().get(1); + } + } else { + // 如果是普通搜索,从URI的查询参数中获取搜索字符串 + searchString = uri.getQueryParameter("pattern"); + } + + // 如果搜索字符串为空,返回null + if (TextUtils.isEmpty(searchString)) { + return null; + } + + // 格式化搜索字符串并执行搜索查询 + try { + searchString = String.format("%%%s%%", searchString); + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, new String[]{searchString}); + } catch (IllegalStateException ex) { + // 如果发生异常,记录日志 + Log.e(TAG, "got exception: " + ex.toString()); + } + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果Cursor不为空,设置通知URI + if (c != null) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; // 返回Cursor对象 + } + + // 实现ContentProvider的insert方法,用于插入数据 + @Override + public Uri insert(Uri uri, ContentValues values) { + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + long dataId = 0, noteId = 0, insertedId = 0; // 初始化ID变量 + + // 根据URI匹配结果执行不同的插入操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,插入新笔记 + insertedId = noteId = db.insert(TABLE.NOTE, null, values); // 插入笔记并获取新笔记的ID + break; + case URI_DATA: + // 如果URI匹配到数据列表,插入新数据 + if (values.containsKey(DataColumns.NOTE_ID)) { + // 如果ContentValues包含笔记ID,则获取该ID + noteId = values.getAsLong(DataColumns.NOTE_ID); + } else { + // 如果没有笔记ID,记录调试信息 + Log.d(TAG, "Wrong data format without note id:" + values.toString()); + } + insertedId = dataId = db.insert(TABLE.DATA, null, values); // 插入数据并获取新数据的ID + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果插入的是笔记,通知变更 + if (noteId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); + } + + // 如果插入的是数据,通知变更 + if (dataId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); + } + + // 返回插入数据的URI + return ContentUris.withAppendedId(uri, insertedId); + } + + // 实现ContentProvider的delete方法,用于删除数据 + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + int count = 0; // 初始化删除计数器 + String id = null; // 初始化ID变量 + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + boolean deleteData = false; // 标记是否删除数据 + + // 根据URI匹配结果执行不同的删除操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,删除笔记 + selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; // 确保只删除ID大于0的笔记 + count = db.delete(TABLE.NOTE, selection, selectionArgs); // 执行删除操作并获取删除计数 + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID并删除该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + long noteId = Long.valueOf(id); // 将ID转换为长整型 + if (noteId <= 0) { + // 如果ID小于等于0,表示系统文件夹,不允许删除,直接跳出 + break; + } + count = db.delete(TABLE.NOTE, + NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 + break; + case URI_DATA: + // 如果URI匹配到数据列表,删除数据 + count = db.delete(TABLE.DATA, selection, selectionArgs); // 执行删除操作并获取删除计数 + deleteData = true; // 设置删除数据标记 + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并删除该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + count = db.delete(TABLE.DATA, + DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); // 执行删除操作并获取删除计数 + deleteData = true; // 设置删除数据标记 + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果删除了数据,通知变更 + if (count > 0) { + if (deleteData) { + // 如果删除的是数据,通知笔记URI变更 + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + // 通知原始URI变更 + getContext().getContentResolver().notifyChange(uri, null); + } + + // 返回删除的记录数 + return count; + } + + // 实现ContentProvider的update方法,用于更新数据 + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + int count = 0; // 初始化更新计数器 + String id = null; // 初始化ID变量 + SQLiteDatabase db = mHelper.getWritableDatabase(); // 获取可写数据库实例 + boolean updateData = false; // 标记是否更新数据 + + // 根据URI匹配结果执行不同的更新操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 如果URI匹配到笔记列表,增加笔记版本号并更新笔记 + increaseNoteVersion(-1, selection, selectionArgs); // 增加笔记版本号 + count = db.update(TABLE.NOTE, values, selection, selectionArgs); // 执行更新操作并获取更新计数 + break; + case URI_NOTE_ITEM: + // 如果URI匹配到单个笔记,获取笔记ID,增加版本号并更新该笔记 + id = uri.getPathSegments().get(1); // 获取URI中的笔记ID + increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); // 增加笔记版本号 + count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 + break; + case URI_DATA: + // 如果URI匹配到数据列表,更新数据 + count = db.update(TABLE.DATA, values, selection, selectionArgs); // 执行更新操作并获取更新计数 + updateData = true; // 设置更新数据标记 + break; + case URI_DATA_ITEM: + // 如果URI匹配到单个数据项,获取数据项ID并更新该数据项 + id = uri.getPathSegments().get(1); // 获取URI中的数据项ID + count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); // 执行更新操作并获取更新计数 + updateData = true; // 设置更新数据标记 + break; + default: + // 如果URI不匹配任何已知模式,抛出异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + + // 如果更新了数据,通知变更 + if (count > 0) { + if (updateData) { + // 如果更新的是数据,通知笔记URI变更 + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + // 通知原始URI变更 + getContext().getContentResolver().notifyChange(uri, null); + } + + // 返回更新的记录数 + return count; + } + + // 解析选择条件,用于构建SQL语句 + private String parseSelection(String selection) { + return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); + } + + // 增加笔记版本号 + private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { + StringBuilder sql = new StringBuilder(120); // 初始化StringBuilder用于构建SQL语句 + sql.append("UPDATE "); + sql.append(TABLE.NOTE); + sql.append(" SET "); + sql.append(NoteColumns.VERSION); + sql.append("=" + NoteColumns.VERSION + "+1 "); // 增加版本号 + + // 如果有ID或者选择条件,添加WHERE子句 + if (id > 0 || !TextUtils.isEmpty(selection)) { + sql.append(" WHERE "); + } + if (id > 0) { + sql.append(NoteColumns.ID + "=" + String.valueOf(id)); // 如果有ID,添加ID条件 + } + if (!TextUtils.isEmpty(selection)) { + String selectString = id > 0 ? parseSelection(selection) : selection; // 解析选择条件 + for (String args : selectionArgs) { + selectString = selectString.replaceFirst("\\?", args); // 替换选择参数 + } + sql.append(selectString); // 添加选择条件到SQL语句 + } + + mHelper.getWritableDatabase().execSQL(sql.toString()); // 执行SQL语句 + } + + // 实现ContentProvider的getType方法,用于返回URI的MIME类型 + @Override + public String getType(Uri uri) { + // TODO: 根据URI返回相应的MIME类型,此处为自动生成的方法存根,需要实现具体逻辑 + return null; + } +} diff --git a/src/notes/gtask/data/MetaData.java b/src/notes/gtask/data/MetaData.java new file mode 100644 index 0000000..88da7bf --- /dev/null +++ b/src/notes/gtask/data/MetaData.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + + +// MetaData类继承自Task类,用于处理元数据 +public class MetaData extends Task { + private final static String TAG = MetaData.class.getSimpleName(); // 日志标签,用于标识日志来源 + + private String mRelatedGid = null; // 相关的GTask ID + + // 设置元数据,将GTask ID和元信息放入JSONObject中,并设置笔记名称 + public void setMeta(String gid, JSONObject metaInfo) { + try { + metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); // 将GTask ID放入元信息中 + } catch (JSONException e) { + Log.e(TAG, "failed to put related gid"); // 日志记录错误信息 + } + setNotes(metaInfo.toString()); // 将JSONObject转换为字符串并设置为笔记内容 + setName(GTaskStringUtils.META_NOTE_NAME); // 设置笔记名称 + } + + // 获取相关的GTask ID + public String getRelatedGid() { + return mRelatedGid; + } + + // 重写isWorthSaving方法,判断笔记内容是否不为空 + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + + // 重写setContentByRemoteJSON方法,从远程JSON中设置内容 + @Override + public void setContentByRemoteJSON(JSONObject js) { + super.setContentByRemoteJSON(js); // 调用父类方法设置内容 + if (getNotes() != null) { + try { + JSONObject metaInfo = new JSONObject(getNotes().trim()); // 将笔记内容转换为JSONObject + mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); // 获取GTask ID + } catch (JSONException e) { + Log.w(TAG, "failed to get related gid"); // 日志记录警告信息 + mRelatedGid = null; // 如果出现异常,将GTask ID设置为null + } + } + } + + // 重写setContentByLocalJSON方法,抛出异常,因为该方法不应该被调用 + @Override + public void setContentByLocalJSON(JSONObject js) { + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + } + + // 重写getLocalJSONFromContent方法,抛出异常,因为该方法不应该被调用 + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + } + + // 重写getSyncAction方法,抛出异常,因为该方法不应该被调用 + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + } +} + diff --git a/src/notes/gtask/data/Node.java b/src/notes/gtask/data/Node.java new file mode 100644 index 0000000..67ef9e3 --- /dev/null +++ b/src/notes/gtask/data/Node.java @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; + +import org.json.JSONObject; + +// Node类是一个抽象类,用于表示同步操作的节点 +public abstract class Node { + // 同步操作常量,表示不需要执行任何同步操作 + public static final int SYNC_ACTION_NONE = 0; + // 同步操作常量,表示需要添加远程数据 + public static final int SYNC_ACTION_ADD_REMOTE = 1; + // 同步操作常量,表示需要添加本地数据 + public static final int SYNC_ACTION_ADD_LOCAL = 2; + // 同步操作常量,表示需要删除远程数据 + public static final int SYNC_ACTION_DEL_REMOTE = 3; + // 同步操作常量,表示需要删除本地数据 + public static final int SYNC_ACTION_DEL_LOCAL = 4; + // 同步操作常量,表示需要更新远程数据 + public static final int SYNC_ACTION_UPDATE_REMOTE = 5; + // 同步操作常量,表示需要更新本地数据 + public static final int SYNC_ACTION_UPDATE_LOCAL = 6; + // 同步操作常量,表示存在更新冲突 + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; + // 同步操作常量,表示同步操作出现错误 + public static final int SYNC_ACTION_ERROR = 8; + + private String mGid; // 节点的GTask ID + private String mName; // 节点的名称 + private long mLastModified; // 节点最后修改时间 + private boolean mDeleted; // 节点是否被删除的标志 + + // Node类的构造函数,初始化成员变量 + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + // 抽象方法,用于获取创建操作的JSON对象 + public abstract JSONObject getCreateAction(int actionId); + + // 抽象方法,用于获取更新操作的JSON对象 + public abstract JSONObject getUpdateAction(int actionId); + + // 抽象方法,用于根据远程JSON设置内容 + public abstract void setContentByRemoteJSON(JSONObject js); + + // 抽象方法,用于根据本地JSON设置内容 + public abstract void setContentByLocalJSON(JSONObject js); + + // 抽象方法,用于从内容获取本地JSON对象 + public abstract JSONObject getLocalJSONFromContent(); + + // 抽象方法,用于获取同步操作类型 + public abstract int getSyncAction(Cursor c); + + // 设置节点的GTask ID + public void setGid(String gid) { + this.mGid = gid; + } + + // 设置节点的名称 + public void setName(String name) { + this.mName = name; + } + + // 设置节点最后修改时间 + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + // 设置节点是否被删除的标志 + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + // 获取节点的GTask ID + public String getGid() { + return this.mGid; + } + + // 获取节点的名称 + public String getName() { + return this.mName; + } + + // 获取节点最后修改时间 + public long getLastModified() { + return this.mLastModified; + } + + // 获取节点是否被删除的标志 + public boolean getDeleted() { + return this.mDeleted; + } + +} + diff --git a/src/notes/gtask/data/SqlData.java b/src/notes/gtask/data/SqlData.java new file mode 100644 index 0000000..d3ec3be --- /dev/null +++ b/src/notes/gtask/data/SqlData.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; +import net.micode.notes.gtask.exception.ActionFailureException; + +import org.json.JSONException; +import org.json.JSONObject; + + +public class SqlData { + private static final String TAG = SqlData.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + + public static final String[] PROJECTION_DATA = new String[] { + DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, + DataColumns.DATA3 + }; + + public static final int DATA_ID_COLUMN = 0; + + public static final int DATA_MIME_TYPE_COLUMN = 1; + + public static final int DATA_CONTENT_COLUMN = 2; + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mDataId; + + private String mDataMimeType; + + private String mDataContent; + + private long mDataContentData1; + + private String mDataContentData3; + + private ContentValues mDiffDataValues; + + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mDataId = INVALID_ID; + mDataMimeType = DataConstants.NOTE; + mDataContent = ""; + mDataContentData1 = 0; + mDataContentData3 = ""; + mDiffDataValues = new ContentValues(); + } + + public SqlData(Context context, Cursor c) { + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDiffDataValues = new ContentValues(); + } + + private void loadFromCursor(Cursor c) { + mDataId = c.getLong(DATA_ID_COLUMN); + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); + mDataContent = c.getString(DATA_CONTENT_COLUMN); + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); + } + + public void setContent(JSONObject js) throws JSONException { + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); + } + mDataId = dataId; + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); + } + mDataMimeType = dataMimeType; + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); + } + mDataContent = dataContent; + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); + } + mDataContentData1 = dataContentData1; + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); + } + mDataContentData3 = dataContentData3; + } + + public JSONObject getContent() throws JSONException { + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + JSONObject js = new JSONObject(); + js.put(DataColumns.ID, mDataId); + js.put(DataColumns.MIME_TYPE, mDataMimeType); + js.put(DataColumns.CONTENT, mDataContent); + js.put(DataColumns.DATA1, mDataContentData1); + js.put(DataColumns.DATA3, mDataContentData3); + return js; + } + + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + } else { + if (mDiffDataValues.size() > 0) { + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); + } else { + result = mContentResolver.update(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { + String.valueOf(noteId), String.valueOf(version) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + } + + mDiffDataValues.clear(); + mIsCreate = false; + } + + public long getId() { + return mDataId; + } +} diff --git a/src/notes/gtask/data/SqlNote.java b/src/notes/gtask/data/SqlNote.java new file mode 100644 index 0000000..79a4095 --- /dev/null +++ b/src/notes/gtask/data/SqlNote.java @@ -0,0 +1,505 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.appwidget.AppWidgetManager; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; +import net.micode.notes.tool.ResourceParser; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class SqlNote { + private static final String TAG = SqlNote.class.getSimpleName(); + + private static final int INVALID_ID = -99999; + + public static final String[] PROJECTION_NOTE = new String[] { + NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, + NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, + NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, + NoteColumns.VERSION + }; + + public static final int ID_COLUMN = 0; + + public static final int ALERTED_DATE_COLUMN = 1; + + public static final int BG_COLOR_ID_COLUMN = 2; + + public static final int CREATED_DATE_COLUMN = 3; + + public static final int HAS_ATTACHMENT_COLUMN = 4; + + public static final int MODIFIED_DATE_COLUMN = 5; + + public static final int NOTES_COUNT_COLUMN = 6; + + public static final int PARENT_ID_COLUMN = 7; + + public static final int SNIPPET_COLUMN = 8; + + public static final int TYPE_COLUMN = 9; + + public static final int WIDGET_ID_COLUMN = 10; + + public static final int WIDGET_TYPE_COLUMN = 11; + + public static final int SYNC_ID_COLUMN = 12; + + public static final int LOCAL_MODIFIED_COLUMN = 13; + + public static final int ORIGIN_PARENT_ID_COLUMN = 14; + + public static final int GTASK_ID_COLUMN = 15; + + public static final int VERSION_COLUMN = 16; + + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mIsCreate; + + private long mId; + + private long mAlertDate; + + private int mBgColorId; + + private long mCreatedDate; + + private int mHasAttachment; + + private long mModifiedDate; + + private long mParentId; + + private String mSnippet; + + private int mType; + + private int mWidgetId; + + private int mWidgetType; + + private long mOriginParent; + + private long mVersion; + + private ContentValues mDiffNoteValues; + + private ArrayList mDataList; + + public SqlNote(Context context) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = true; + mId = INVALID_ID; + mAlertDate = 0; + mBgColorId = ResourceParser.getDefaultBgId(context); + mCreatedDate = System.currentTimeMillis(); + mHasAttachment = 0; + mModifiedDate = System.currentTimeMillis(); + mParentId = 0; + mSnippet = ""; + mType = Notes.TYPE_NOTE; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + mOriginParent = 0; + mVersion = 0; + mDiffNoteValues = new ContentValues(); + mDataList = new ArrayList(); + } + + public SqlNote(Context context, Cursor c) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(c); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + } + + public SqlNote(Context context, long id) { + mContext = context; + mContentResolver = context.getContentResolver(); + mIsCreate = false; + loadFromCursor(id); + mDataList = new ArrayList(); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + mDiffNoteValues = new ContentValues(); + + } + + private void loadFromCursor(long id) { + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(id) + }, null); + if (c != null) { + c.moveToNext(); + loadFromCursor(c); + } else { + Log.w(TAG, "loadFromCursor: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + private void loadFromCursor(Cursor c) { + mId = c.getLong(ID_COLUMN); + mAlertDate = c.getLong(ALERTED_DATE_COLUMN); + mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = c.getLong(CREATED_DATE_COLUMN); + mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); + mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); + mParentId = c.getLong(PARENT_ID_COLUMN); + mSnippet = c.getString(SNIPPET_COLUMN); + mType = c.getInt(TYPE_COLUMN); + mWidgetId = c.getInt(WIDGET_ID_COLUMN); + mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); + mVersion = c.getLong(VERSION_COLUMN); + } + + private void loadDataContent() { + Cursor c = null; + mDataList.clear(); + try { + c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, + "(note_id=?)", new String[] { + String.valueOf(mId) + }, null); + if (c != null) { + if (c.getCount() == 0) { + Log.w(TAG, "it seems that the note has not data"); + return; + } + while (c.moveToNext()) { + SqlData data = new SqlData(mContext, c); + mDataList.add(data); + } + } else { + Log.w(TAG, "loadDataContent: cursor = null"); + } + } finally { + if (c != null) + c.close(); + } + } + + public boolean setContent(JSONObject js) { + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + Log.w(TAG, "cannot set system folder"); + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + // for folder we can only update the snnipet and type + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; + if (mIsCreate || mId != id) { + mDiffNoteValues.put(NoteColumns.ID, id); + } + mId = id; + + long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note + .getLong(NoteColumns.ALERTED_DATE) : 0; + if (mIsCreate || mAlertDate != alertDate) { + mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); + } + mAlertDate = alertDate; + + int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note + .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); + if (mIsCreate || mBgColorId != bgColorId) { + mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); + } + mBgColorId = bgColorId; + + long createDate = note.has(NoteColumns.CREATED_DATE) ? note + .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mCreatedDate != createDate) { + mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); + } + mCreatedDate = createDate; + + int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note + .getInt(NoteColumns.HAS_ATTACHMENT) : 0; + if (mIsCreate || mHasAttachment != hasAttachment) { + mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); + } + mHasAttachment = hasAttachment; + + long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note + .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); + if (mIsCreate || mModifiedDate != modifiedDate) { + mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); + } + mModifiedDate = modifiedDate; + + long parentId = note.has(NoteColumns.PARENT_ID) ? note + .getLong(NoteColumns.PARENT_ID) : 0; + if (mIsCreate || mParentId != parentId) { + mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); + } + mParentId = parentId; + + String snippet = note.has(NoteColumns.SNIPPET) ? note + .getString(NoteColumns.SNIPPET) : ""; + if (mIsCreate || !mSnippet.equals(snippet)) { + mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); + } + mSnippet = snippet; + + int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) + : Notes.TYPE_NOTE; + if (mIsCreate || mType != type) { + mDiffNoteValues.put(NoteColumns.TYPE, type); + } + mType = type; + + int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) + : AppWidgetManager.INVALID_APPWIDGET_ID; + if (mIsCreate || mWidgetId != widgetId) { + mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); + } + mWidgetId = widgetId; + + int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note + .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; + if (mIsCreate || mWidgetType != widgetType) { + mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); + } + mWidgetType = widgetType; + + long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note + .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; + if (mIsCreate || mOriginParent != originParent) { + mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); + } + mOriginParent = originParent; + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + SqlData sqlData = null; + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + for (SqlData temp : mDataList) { + if (dataId == temp.getId()) { + sqlData = temp; + } + } + } + + if (sqlData == null) { + sqlData = new SqlData(mContext); + mDataList.add(sqlData); + } + + sqlData.setContent(data); + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } + return true; + } + + public JSONObject getContent() { + try { + JSONObject js = new JSONObject(); + + if (mIsCreate) { + Log.e(TAG, "it seems that we haven't created this in database yet"); + return null; + } + + JSONObject note = new JSONObject(); + if (mType == Notes.TYPE_NOTE) { + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.ALERTED_DATE, mAlertDate); + note.put(NoteColumns.BG_COLOR_ID, mBgColorId); + note.put(NoteColumns.CREATED_DATE, mCreatedDate); + note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); + note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); + note.put(NoteColumns.PARENT_ID, mParentId); + note.put(NoteColumns.SNIPPET, mSnippet); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.WIDGET_ID, mWidgetId); + note.put(NoteColumns.WIDGET_TYPE, mWidgetType); + note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + + JSONArray dataArray = new JSONArray(); + for (SqlData sqlData : mDataList) { + JSONObject data = sqlData.getContent(); + if (data != null) { + dataArray.put(data); + } + } + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { + note.put(NoteColumns.ID, mId); + note.put(NoteColumns.TYPE, mType); + note.put(NoteColumns.SNIPPET, mSnippet); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + } + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + return null; + } + + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + public long getId() { + return mId; + } + + public long getParentId() { + return mParentId; + } + + public String getSnippet() { + return mSnippet; + } + + public boolean isNoteType() { + return mType == Notes.TYPE_NOTE; + } + + public void commit(boolean validateVersion) { + if (mIsCreate) { + if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { + mDiffNoteValues.remove(NoteColumns.ID); + } + + Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); + try { + mId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + throw new ActionFailureException("create note failed"); + } + if (mId == 0) { + throw new IllegalStateException("Create thread id failed"); + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, false, -1); + } + } + } else { + if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { + Log.e(TAG, "No such note"); + throw new IllegalStateException("Try to update note with invalid id"); + } + if (mDiffNoteValues.size() > 0) { + mVersion ++; + int result = 0; + if (!validateVersion) { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?)", new String[] { + String.valueOf(mId) + }); + } else { + result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", + new String[] { + String.valueOf(mId), String.valueOf(mVersion) + }); + } + if (result == 0) { + Log.w(TAG, "there is no update. maybe user updates note when syncing"); + } + } + + if (mType == Notes.TYPE_NOTE) { + for (SqlData sqlData : mDataList) { + sqlData.commit(mId, validateVersion, mVersion); + } + } + } + + // refresh local info + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} diff --git a/src/notes/gtask/data/Task.java b/src/notes/gtask/data/Task.java new file mode 100644 index 0000000..6a19454 --- /dev/null +++ b/src/notes/gtask/data/Task.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + + +public class Task extends Node { + private static final String TAG = Task.class.getSimpleName(); + + private boolean mCompleted; + + private String mNotes; + + private JSONObject mMetaInfo; + + private Task mPriorSibling; + + private TaskList mParent; + + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null; + mParent = null; + mMetaInfo = null; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_TASK); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + // parent_id + js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); + + // dest_parent_type + js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + + // list_id + js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); + + // prior_sibling_id + if (mPriorSibling != null) { + js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + if (getNotes() != null) { + entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); + } + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate task-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + // notes + if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { + setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); + } + + // deleted + if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { + setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); + } + + // completed + if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { + setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get task content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) + || !js.has(GTaskStringUtils.META_HEAD_DATA)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { + Log.e(TAG, "invalid type"); + return; + } + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + setName(data.getString(DataColumns.CONTENT)); + break; + } + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + String name = getName(); + try { + if (mMetaInfo == null) { + // new task created from web + if (name == null) { + Log.w(TAG, "the note seems to be an empty one"); + return null; + } + + JSONObject js = new JSONObject(); + JSONObject note = new JSONObject(); + JSONArray dataArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put(DataColumns.CONTENT, name); + dataArray.put(data); + js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + js.put(GTaskStringUtils.META_HEAD_NOTE, note); + return js; + } else { + // synced task + JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { + data.put(DataColumns.CONTENT, getName()); + break; + } + } + + note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + return mMetaInfo; + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public void setMetaInfo(MetaData metaData) { + if (metaData != null && metaData.getNotes() != null) { + try { + mMetaInfo = new JSONObject(metaData.getNotes()); + } catch (JSONException e) { + Log.w(TAG, e.toString()); + mMetaInfo = null; + } + } + } + + public int getSyncAction(Cursor c) { + try { + JSONObject noteInfo = null; + if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + } + + if (noteInfo == null) { + Log.w(TAG, "it seems that note meta has been deleted"); + return SYNC_ACTION_UPDATE_REMOTE; + } + + if (!noteInfo.has(NoteColumns.ID)) { + Log.w(TAG, "remote note id seems to be deleted"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + // validate the note id now + if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { + Log.w(TAG, "note id doesn't match"); + return SYNC_ACTION_UPDATE_LOCAL; + } + + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + return SYNC_ACTION_UPDATE_CONFLICT; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + public void setNotes(String notes) { + this.mNotes = notes; + } + + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + public void setParent(TaskList parent) { + this.mParent = parent; + } + + public boolean getCompleted() { + return this.mCompleted; + } + + public String getNotes() { + return this.mNotes; + } + + public Task getPriorSibling() { + return this.mPriorSibling; + } + + public TaskList getParent() { + return this.mParent; + } + +} diff --git a/src/notes/gtask/data/TaskList.java b/src/notes/gtask/data/TaskList.java new file mode 100644 index 0000000..4ea21c5 --- /dev/null +++ b/src/notes/gtask/data/TaskList.java @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.data; + +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; + + +public class TaskList extends Node { + private static final String TAG = TaskList.class.getSimpleName(); + + private int mIndex; + + private ArrayList mChildren; + + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // index + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); + entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, + GTaskStringUtils.GTASK_JSON_TYPE_GROUP); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-create jsonobject"); + } + + return js; + } + + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // action_type + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // action_id + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // id + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // entity_delta + JSONObject entity = new JSONObject(); + entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); + entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); + js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to generate tasklist-update jsonobject"); + } + + return js; + } + + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // id + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // last_modified + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // name + if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { + setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); + } + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("fail to get tasklist content from jsonobject"); + } + } + } + + public void setContentByLocalJSON(JSONObject js) { + if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { + Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); + } + + try { + JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + + if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { + String name = folder.getString(NoteColumns.SNIPPET); + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); + } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { + if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); + else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) + setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE); + else + Log.e(TAG, "invalid system folder"); + } else { + Log.e(TAG, "error type"); + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + } + + public JSONObject getLocalJSONFromContent() { + try { + JSONObject js = new JSONObject(); + JSONObject folder = new JSONObject(); + + String folderName = getName(); + if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) + folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), + folderName.length()); + folder.put(NoteColumns.SNIPPET, folderName); + if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) + || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) + folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + else + folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + + js.put(GTaskStringUtils.META_HEAD_NOTE, folder); + + return js; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return null; + } + } + + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // there is no local update + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // no update both side + return SYNC_ACTION_NONE; + } else { + // apply remote to local + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // validate gtask id + if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { + Log.e(TAG, "gtask id doesn't match"); + return SYNC_ACTION_ERROR; + } + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // local modification only + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // for folder conflicts, just apply local modification + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + public int getChildTaskCount() { + return mChildren.size(); + } + + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // need to set prior sibling and parent + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + } + } + return ret; + } + + public boolean addChildTask(Task task, int index) { + if (index < 0 || index > mChildren.size()) { + Log.e(TAG, "add child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (task != null && pos == -1) { + mChildren.add(index, task); + + // update the task list + Task preTask = null; + Task afterTask = null; + if (index != 0) + preTask = mChildren.get(index - 1); + if (index != mChildren.size() - 1) + afterTask = mChildren.get(index + 1); + + task.setPriorSibling(preTask); + if (afterTask != null) + afterTask.setPriorSibling(task); + } + + return true; + } + + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // reset prior sibling and parent + task.setPriorSibling(null); + task.setParent(null); + + // update the task list + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + public boolean moveChildTask(Task task, int index) { + + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "move child task: invalid index"); + return false; + } + + int pos = mChildren.indexOf(task); + if (pos == -1) { + Log.e(TAG, "move child task: the task should in the list"); + return false; + } + + if (pos == index) + return true; + return (removeChildTask(task) && addChildTask(task, index)); + } + + public Task findChildTaskByGid(String gid) { + for (int i = 0; i < mChildren.size(); i++) { + Task t = mChildren.get(i); + if (t.getGid().equals(gid)) { + return t; + } + } + return null; + } + + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) { + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + public ArrayList getChildTaskList() { + return this.mChildren; + } + + public void setIndex(int index) { + this.mIndex = index; + } + + public int getIndex() { + return this.mIndex; + } +} diff --git a/src/notes/gtask/exception/ActionFailureException.java b/src/notes/gtask/exception/ActionFailureException.java new file mode 100644 index 0000000..15504be --- /dev/null +++ b/src/notes/gtask/exception/ActionFailureException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.exception; + +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L; + + public ActionFailureException() { + super(); + } + + public ActionFailureException(String paramString) { + super(paramString); + } + + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/src/notes/gtask/exception/NetworkFailureException.java b/src/notes/gtask/exception/NetworkFailureException.java new file mode 100644 index 0000000..b08cfb1 --- /dev/null +++ b/src/notes/gtask/exception/NetworkFailureException.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.exception; + +public class NetworkFailureException extends Exception { + private static final long serialVersionUID = 2107610287180234136L; + + public NetworkFailureException() { + super(); + } + + public NetworkFailureException(String paramString) { + super(paramString); + } + + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/src/notes/gtask/remote/GTaskASyncTask.java b/src/notes/gtask/remote/GTaskASyncTask.java new file mode 100644 index 0000000..a1deb99 --- /dev/null +++ b/src/notes/gtask/remote/GTaskASyncTask.java @@ -0,0 +1,124 @@ + +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; + +import net.micode.notes.R; +import net.micode.notes.ui.NotesListActivity; +import net.micode.notes.ui.NotesPreferenceActivity; + + +public class GTaskASyncTask extends AsyncTask { + + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + public interface OnCompleteListener { + void onComplete(); + } + + private Context mContext; + + private NotificationManager mNotifiManager; + + private GTaskManager mTaskManager; + + private OnCompleteListener mOnCompleteListener; + + public GTaskASyncTask(Context context, OnCompleteListener listener) { + mContext = context; + mOnCompleteListener = listener; + mNotifiManager = (NotificationManager) mContext + .getSystemService(Context.NOTIFICATION_SERVICE); + mTaskManager = GTaskManager.getInstance(); + } + + public void cancelSync() { + mTaskManager.cancelSync(); + } + + public void publishProgess(String message) { + publishProgress(new String[] { + message + }); + } + + private void showNotification(int tickerId, String content) { + PendingIntent pendingIntent; + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE); + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE); + } + Notification.Builder builder = new Notification.Builder(mContext) + .setAutoCancel(true) + .setContentTitle(mContext.getString(R.string.app_name)) + .setContentText(content) + .setContentIntent(pendingIntent) + .setWhen(System.currentTimeMillis()) + .setOngoing(true); + Notification notification=builder.getNotification(); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); + } + + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); + return mTaskManager.sync(mContext, this); + } + + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + @Override + protected void onPostExecute(Integer result) { + if (result == GTaskManager.STATE_SUCCESS) { + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } + if (mOnCompleteListener != null) { + new Thread(new Runnable() { + + public void run() { + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} diff --git a/src/notes/gtask/remote/GTaskClient.java b/src/notes/gtask/remote/GTaskClient.java new file mode 100644 index 0000000..c67dfdf --- /dev/null +++ b/src/notes/gtask/remote/GTaskClient.java @@ -0,0 +1,585 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerFuture; +import android.app.Activity; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.gtask.data.Node; +import net.micode.notes.gtask.data.Task; +import net.micode.notes.gtask.data.TaskList; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.gtask.exception.NetworkFailureException; +import net.micode.notes.tool.GTaskStringUtils; +import net.micode.notes.ui.NotesPreferenceActivity; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.cookie.Cookie; +import org.apache.http.impl.client.BasicCookieStore; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; +import java.util.zip.GZIPInputStream; +import java.util.zip.Inflater; +import java.util.zip.InflaterInputStream; + + +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + private static final String GTASK_URL = "https://mail.google.com/tasks/"; + + private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; + + private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; + + private static GTaskClient mInstance = null; + + private DefaultHttpClient mHttpClient; + + private String mGetUrl; + + private String mPostUrl; + + private long mClientVersion; + + private boolean mLoggedin; + + private long mLastLoginTime; + + private int mActionId; + + private Account mAccount; + + private JSONArray mUpdateArray; + + private GTaskClient() { + mHttpClient = null; + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + mClientVersion = -1; + mLoggedin = false; + mLastLoginTime = 0; + mActionId = 1; + mAccount = null; + mUpdateArray = null; + } + + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + public boolean login(Activity activity) { + // we suppose that the cookie would expire after 5 minutes + // then we need to re-login + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // need to re-login after account switch + if (mLoggedin + && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity + .getSyncAccountName(activity))) { + mLoggedin = false; + } + + if (mLoggedin) { + Log.d(TAG, "already logged in"); + return true; + } + + mLastLoginTime = System.currentTimeMillis(); + String authToken = loginGoogleAccount(activity, false); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + // login with custom domain if necessary + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() + .endsWith("googlemail.com"))) { + StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); + int index = mAccount.name.indexOf('@') + 1; + String suffix = mAccount.name.substring(index); + url.append(suffix + "/"); + mGetUrl = url.toString() + "ig"; + mPostUrl = url.toString() + "r/ig"; + + if (tryToLoginGtask(activity, authToken)) { + mLoggedin = true; + } + } + + // try to login with google official url + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + String authToken; + AccountManager accountManager = AccountManager.get(activity); + Account[] accounts = accountManager.getAccountsByType("com.google"); + + if (accounts.length == 0) { + Log.e(TAG, "there is no available google account"); + return null; + } + + String accountName = NotesPreferenceActivity.getSyncAccountName(activity); + Account account = null; + for (Account a : accounts) { + if (a.name.equals(accountName)) { + account = a; + break; + } + } + if (account != null) { + mAccount = account; + } else { + Log.e(TAG, "unable to get an account with the same name in the settings"); + return null; + } + + // get the token now + AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, + "goanna_mobile", null, activity, null, null); + try { + Bundle authTokenBundle = accountManagerFuture.getResult(); + authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + if (invalidateToken) { + accountManager.invalidateAuthToken("com.google", authToken); + loginGoogleAccount(activity, false); + } + } catch (Exception e) { + Log.e(TAG, "get auth token failed"); + authToken = null; + } + + return authToken; + } + + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // maybe the auth token is out of date, now let's invalidate the + // token and try again + authToken = loginGoogleAccount(activity, true); + if (authToken == null) { + Log.e(TAG, "login google account failed"); + return false; + } + + if (!loginGtask(authToken)) { + Log.e(TAG, "login gtask failed"); + return false; + } + } + return true; + } + + private boolean loginGtask(String authToken) { + int timeoutConnection = 10000; + int timeoutSocket = 15000; + HttpParams httpParameters = new BasicHttpParams(); + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); + mHttpClient = new DefaultHttpClient(httpParameters); + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); + mHttpClient.setCookieStore(localBasicCookieStore); + HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); + + // login gtask + try { + String loginUrl = mGetUrl + "?auth=" + authToken; + HttpGet httpGet = new HttpGet(loginUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the cookie now + List cookies = mHttpClient.getCookieStore().getCookies(); + boolean hasAuthCookie = false; + for (Cookie cookie : cookies) { + if (cookie.getName().contains("GTL")) { + hasAuthCookie = true; + } + } + if (!hasAuthCookie) { + Log.w(TAG, "it seems that there is no auth cookie"); + } + + // get the client version + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + mClientVersion = js.getLong("v"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return false; + } catch (Exception e) { + // simply catch all exceptions + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + private int getActionId() { + return mActionId++; + } + + private HttpPost createHttpPost() { + HttpPost httpPost = new HttpPost(mPostUrl); + httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + httpPost.setHeader("AT", "1"); + return httpPost; + } + + private String getResponseContent(HttpEntity entity) throws IOException { + String contentEncoding = null; + if (entity.getContentEncoding() != null) { + contentEncoding = entity.getContentEncoding().getValue(); + Log.d(TAG, "encoding: " + contentEncoding); + } + + InputStream input = entity.getContent(); + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { + input = new GZIPInputStream(entity.getContent()); + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { + Inflater inflater = new Inflater(true); + input = new InflaterInputStream(entity.getContent(), inflater); + } + + try { + InputStreamReader isr = new InputStreamReader(input); + BufferedReader br = new BufferedReader(isr); + StringBuilder sb = new StringBuilder(); + + while (true) { + String buff = br.readLine(); + if (buff == null) { + return sb.toString(); + } + sb = sb.append(buff); + } + } finally { + input.close(); + } + } + + private JSONObject postRequest(JSONObject js) throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + HttpPost httpPost = createHttpPost(); + try { + LinkedList list = new LinkedList(); + list.add(new BasicNameValuePair("r", js.toString())); + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); + httpPost.setEntity(entity); + + // execute the post + HttpResponse response = mHttpClient.execute(httpPost); + String jsString = getResponseContent(response.getEntity()); + return new JSONObject(jsString); + + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("postRequest failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("unable to convert response content to jsonobject"); + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("error occurs when posting request"); + } + } + + public void createTask(Task task) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(task.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create task: handing jsonobject failed"); + } + } + + public void createTaskList(TaskList tasklist) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + actionList.put(tasklist.getCreateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + // post + JSONObject jsResponse = postRequest(jsPost); + JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( + GTaskStringUtils.GTASK_JSON_RESULTS).get(0); + tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("create tasklist: handing jsonobject failed"); + } + } + + public void commitUpdate() throws NetworkFailureException { + if (mUpdateArray != null) { + try { + JSONObject jsPost = new JSONObject(); + + // action_list + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("commit update: handing jsonobject failed"); + } + } + } + + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // too many update items may result in an error + // set max to 10 items + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + public void moveTask(Task task, TaskList preParent, TaskList curParent) + throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); + if (preParent == curParent && task.getPriorSibling() != null) { + // put prioring_sibing_id only if moving within the tasklist and + // it is not the first one + action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); + } + action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); + action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); + if (preParent != curParent) { + // put the dest_list only if moving between tasklists + action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); + } + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("move task: handing jsonobject failed"); + } + } + + public void deleteNode(Node node) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + + // action_list + node.setDeleted(true); + actionList.put(node.getUpdateAction(getActionId())); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + postRequest(jsPost); + mUpdateArray = null; + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("delete node: handing jsonobject failed"); + } + } + + public JSONArray getTaskLists() throws NetworkFailureException { + if (!mLoggedin) { + Log.e(TAG, "please login first"); + throw new ActionFailureException("not logged in"); + } + + try { + HttpGet httpGet = new HttpGet(mGetUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // get the task list + String resString = getResponseContent(response.getEntity()); + String jsBegin = "_setup("; + String jsEnd = ")}"; + int begin = resString.indexOf(jsBegin); + int end = resString.lastIndexOf(jsEnd); + String jsString = null; + if (begin != -1 && end != -1 && begin < end) { + jsString = resString.substring(begin + jsBegin.length(), end); + } + JSONObject js = new JSONObject(jsString); + return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); + } catch (ClientProtocolException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (IOException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new NetworkFailureException("gettasklists: httpget failed"); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task lists: handing jasonobject failed"); + } + } + + public JSONArray getTaskList(String listGid) throws NetworkFailureException { + commitUpdate(); + try { + JSONObject jsPost = new JSONObject(); + JSONArray actionList = new JSONArray(); + JSONObject action = new JSONObject(); + + // action_list + action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); + action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); + action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); + actionList.put(action); + jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); + + // client_version + jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); + + JSONObject jsResponse = postRequest(jsPost); + return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("get task list: handing jsonobject failed"); + } + } + + public Account getSyncAccount() { + return mAccount; + } + + public void resetUpdateArray() { + mUpdateArray = null; + } +} diff --git a/src/notes/gtask/remote/GTaskManager.java b/src/notes/gtask/remote/GTaskManager.java new file mode 100644 index 0000000..d2b4082 --- /dev/null +++ b/src/notes/gtask/remote/GTaskManager.java @@ -0,0 +1,800 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.data.MetaData; +import net.micode.notes.gtask.data.Node; +import net.micode.notes.gtask.data.SqlNote; +import net.micode.notes.gtask.data.Task; +import net.micode.notes.gtask.data.TaskList; +import net.micode.notes.gtask.exception.ActionFailureException; +import net.micode.notes.gtask.exception.NetworkFailureException; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.GTaskStringUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + + +public class GTaskManager { + private static final String TAG = GTaskManager.class.getSimpleName(); + + public static final int STATE_SUCCESS = 0; + + public static final int STATE_NETWORK_ERROR = 1; + + public static final int STATE_INTERNAL_ERROR = 2; + + public static final int STATE_SYNC_IN_PROGRESS = 3; + + public static final int STATE_SYNC_CANCELLED = 4; + + private static GTaskManager mInstance = null; + + private Activity mActivity; + + private Context mContext; + + private ContentResolver mContentResolver; + + private boolean mSyncing; + + private boolean mCancelled; + + private HashMap mGTaskListHashMap; + + private HashMap mGTaskHashMap; + + private HashMap mMetaHashMap; + + private TaskList mMetaList; + + private HashSet mLocalDeleteIdMap; + + private HashMap mGidToNid; + + private HashMap mNidToGid; + + private GTaskManager() { + mSyncing = false; + mCancelled = false; + mGTaskListHashMap = new HashMap(); + mGTaskHashMap = new HashMap(); + mMetaHashMap = new HashMap(); + mMetaList = null; + mLocalDeleteIdMap = new HashSet(); + mGidToNid = new HashMap(); + mNidToGid = new HashMap(); + } + + public static synchronized GTaskManager getInstance() { + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + public synchronized void setActivityContext(Activity activity) { + // used for getting authtoken + mActivity = activity; + } + + public int sync(Context context, GTaskASyncTask asyncTask) { + if (mSyncing) { + Log.d(TAG, "Sync is in progress"); + return STATE_SYNC_IN_PROGRESS; + } + mContext = context; + mContentResolver = mContext.getContentResolver(); + mSyncing = true; + mCancelled = false; + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + + try { + GTaskClient client = GTaskClient.getInstance(); + client.resetUpdateArray(); + + // login google task + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // get the task list from google + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); + + // do content sync work + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); + syncContent(); + } catch (NetworkFailureException e) { + Log.e(TAG, e.toString()); + return STATE_NETWORK_ERROR; + } catch (ActionFailureException e) { + Log.e(TAG, e.toString()); + return STATE_INTERNAL_ERROR; + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + return STATE_INTERNAL_ERROR; + } finally { + mGTaskListHashMap.clear(); + mGTaskHashMap.clear(); + mMetaHashMap.clear(); + mLocalDeleteIdMap.clear(); + mGidToNid.clear(); + mNidToGid.clear(); + mSyncing = false; + } + + return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; + } + + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); + try { + JSONArray jsTaskLists = client.getTaskLists(); + + // init meta list first + mMetaList = null; + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name + .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { + mMetaList = new TaskList(); + mMetaList.setContentByRemoteJSON(object); + + // load meta data + JSONArray jsMetas = client.getTaskList(gid); + for (int j = 0; j < jsMetas.length(); j++) { + object = (JSONObject) jsMetas.getJSONObject(j); + MetaData metaData = new MetaData(); + metaData.setContentByRemoteJSON(object); + if (metaData.isWorthSaving()) { + mMetaList.addChildTask(metaData); + if (metaData.getGid() != null) { + mMetaHashMap.put(metaData.getRelatedGid(), metaData); + } + } + } + } + } + + // create meta list if not existed + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // init task list + for (int i = 0; i < jsTaskLists.length(); i++) { + JSONObject object = jsTaskLists.getJSONObject(i); + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); + + if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) + && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META)) { + TaskList tasklist = new TaskList(); + tasklist.setContentByRemoteJSON(object); + mGTaskListHashMap.put(gid, tasklist); + mGTaskHashMap.put(gid, tasklist); + + // load tasks + JSONArray jsTasks = client.getTaskList(gid); + for (int j = 0; j < jsTasks.length(); j++) { + object = (JSONObject) jsTasks.getJSONObject(j); + gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); + Task task = new Task(); + task.setContentByRemoteJSON(object); + if (task.isWorthSaving()) { + task.setMetaInfo(mMetaHashMap.get(gid)); + tasklist.addChildTask(task); + mGTaskHashMap.put(gid, task); + } + } + } + } + } catch (JSONException e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + throw new ActionFailureException("initGTaskList: handing JSONObject failed"); + } + } + + private void syncContent() throws NetworkFailureException { + int syncType; + Cursor c = null; + String gid; + Node node; + + mLocalDeleteIdMap.clear(); + + if (mCancelled) { + return; + } + + // for local deleted note + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id=?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, null); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); + } + + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + } + } else { + Log.w(TAG, "failed to query trash folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // sync folder first + syncFolder(); + + // for note existing in database + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing note in database"); + } + + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // go through remaining items + Iterator> iter = mGTaskHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + node = entry.getValue(); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + + // mCancelled can be set by another thread, so we neet to check one by + // one + // clear local delete table + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // refresh local sync id + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // for root folder + try { + c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); + if (c != null) { + c.moveToNext(); + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); + mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); + // for system folder, only update remote name if necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } else { + Log.w(TAG, "failed to query root folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for call-note folder + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", + new String[] { + String.valueOf(Notes.ID_CALL_RECORD_FOLDER) + }, null); + if (c != null) { + if (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); + mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); + // for system folder, only update remote name if + // necessary + if (!node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_CALL_NOTE)) + doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); + } else { + doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); + } + } + } else { + Log.w(TAG, "failed to query call note folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for local existing folders + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type=? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + gid = c.getString(SqlNote.GTASK_ID_COLUMN); + node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); + syncType = node.getSyncAction(c); + } else { + if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { + // local add + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // remote delete + syncType = Node.SYNC_ACTION_DEL_LOCAL; + } + } + doContentSync(syncType, node, c); + } + } else { + Log.w(TAG, "failed to query existing folder"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + + // for remote add folders + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + gid = entry.getKey(); + node = entry.getValue(); + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); + } + } + + if (!mCancelled) + GTaskClient.getInstance().commitUpdate(); + } + + private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + MetaData meta; + switch (syncType) { + case Node.SYNC_ACTION_ADD_LOCAL: + addLocalNode(node); + break; + case Node.SYNC_ACTION_ADD_REMOTE: + addRemoteNode(node, c); + break; + case Node.SYNC_ACTION_DEL_LOCAL: + meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); + break; + case Node.SYNC_ACTION_DEL_REMOTE: + meta = mMetaHashMap.get(node.getGid()); + if (meta != null) { + GTaskClient.getInstance().deleteNode(meta); + } + GTaskClient.getInstance().deleteNode(node); + break; + case Node.SYNC_ACTION_UPDATE_LOCAL: + updateLocalNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_REMOTE: + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_UPDATE_CONFLICT: + // merging both modifications maybe a good idea + // right now just use local update simply + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unkown sync action type"); + } + } + + private void addLocalNode(Node node) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + if (node instanceof TaskList) { + if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { + sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); + } else if (node.getName().equals( + GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { + sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); + } else { + sqlNote = new SqlNote(mContext); + sqlNote.setContent(node.getLocalJSONFromContent()); + sqlNote.setParentId(Notes.ID_ROOT_FOLDER); + } + } else { + sqlNote = new SqlNote(mContext); + JSONObject js = node.getLocalJSONFromContent(); + try { + if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { + JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + if (note.has(NoteColumns.ID)) { + long id = note.getLong(NoteColumns.ID); + if (DataUtils.existInNoteDatabase(mContentResolver, id)) { + // the id is not available, have to create a new one + note.remove(NoteColumns.ID); + } + } + } + + if (js.has(GTaskStringUtils.META_HEAD_DATA)) { + JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + for (int i = 0; i < dataArray.length(); i++) { + JSONObject data = dataArray.getJSONObject(i); + if (data.has(DataColumns.ID)) { + long dataId = data.getLong(DataColumns.ID); + if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { + // the data id is not available, have to create + // a new one + data.remove(DataColumns.ID); + } + } + } + + } + } catch (JSONException e) { + Log.w(TAG, e.toString()); + e.printStackTrace(); + } + sqlNote.setContent(js); + + Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot add local node"); + } + sqlNote.setParentId(parentId.longValue()); + } + + // create the local node + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // update gid-nid mapping + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + } + + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // update the note locally + sqlNote = new SqlNote(mContext, c); + sqlNote.setContent(node.getLocalJSONFromContent()); + + Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) + : new Long(Notes.ID_ROOT_FOLDER); + if (parentId == null) { + Log.e(TAG, "cannot find task's parent id locally"); + throw new ActionFailureException("cannot update local node"); + } + sqlNote.setParentId(parentId.longValue()); + sqlNote.commit(true); + + // update meta info + updateRemoteMeta(node.getGid(), sqlNote); + } + + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + Node n; + + // update remotely + if (sqlNote.isNoteType()) { + Task task = new Task(); + task.setContentByLocalJSON(sqlNote.getContent()); + + String parentGid = mNidToGid.get(sqlNote.getParentId()); + if (parentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot add remote task"); + } + mGTaskListHashMap.get(parentGid).addChildTask(task); + + GTaskClient.getInstance().createTask(task); + n = (Node) task; + + // add meta + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // we need to skip folder if it has already existed + String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; + if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) + folderName += GTaskStringUtils.FOLDER_DEFAULT; + else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) + folderName += GTaskStringUtils.FOLDER_CALL_NOTE; + else + folderName += sqlNote.getSnippet(); + + Iterator> iter = mGTaskListHashMap.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + String gid = entry.getKey(); + TaskList list = entry.getValue(); + + if (list.getName().equals(folderName)) { + tasklist = list; + if (mGTaskHashMap.containsKey(gid)) { + mGTaskHashMap.remove(gid); + } + break; + } + } + + // no match we can add now + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // update local note + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id mapping + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + + if (preParentList != curParentList) { + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + sqlNote.commit(true); + } + + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + public void cancelSync() { + mCancelled = true; + } +} diff --git a/src/notes/gtask/remote/GTaskSyncService.java b/src/notes/gtask/remote/GTaskSyncService.java new file mode 100644 index 0000000..cca36f7 --- /dev/null +++ b/src/notes/gtask/remote/GTaskSyncService.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.gtask.remote; + +import android.app.Activity; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.IBinder; + +public class GTaskSyncService extends Service { + public final static String ACTION_STRING_NAME = "sync_action_type"; + + public final static int ACTION_START_SYNC = 0; + + public final static int ACTION_CANCEL_SYNC = 1; + + public final static int ACTION_INVALID = 2; + + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; + + private static GTaskASyncTask mSyncTask = null; + + private static String mSyncProgress = ""; + + private void startSync() { + if (mSyncTask == null) { + mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { + public void onComplete() { + mSyncTask = null; + sendBroadcast(""); + stopSelf(); + } + }); + sendBroadcast(""); + mSyncTask.execute(); + } + } + + private void cancelSync() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + @Override + public void onCreate() { + mSyncTask = null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Bundle bundle = intent.getExtras(); + if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { + switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { + case ACTION_START_SYNC: + startSync(); + break; + case ACTION_CANCEL_SYNC: + cancelSync(); + break; + default: + break; + } + return START_STICKY; + } + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onLowMemory() { + if (mSyncTask != null) { + mSyncTask.cancelSync(); + } + } + + public IBinder onBind(Intent intent) { + return null; + } + + public void sendBroadcast(String msg) { + mSyncProgress = msg; + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); + intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); + sendBroadcast(intent); + } + + public static void startSync(Activity activity) { + GTaskManager.getInstance().setActivityContext(activity); + Intent intent = new Intent(activity, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); + activity.startService(intent); + } + + public static void cancelSync(Context context) { + Intent intent = new Intent(context, GTaskSyncService.class); + intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); + context.startService(intent); + } + + public static boolean isSyncing() { + return mSyncTask != null; + } + + public static String getProgressString() { + return mSyncProgress; + } +} diff --git a/src/notes/model/Note.java b/src/notes/model/Note.java new file mode 100644 index 0000000..6706cf6 --- /dev/null +++ b/src/notes/model/Note.java @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.model; +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.net.Uri; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; + +import java.util.ArrayList; + + +public class Note { + private ContentValues mNoteDiffValues; + private NoteData mNoteData; + private static final String TAG = "Note"; + /** + * Create a new note id for adding a new note to databases + */ + public static synchronized long getNewNoteId(Context context, long folderId) { + // Create a new note in the database + ContentValues values = new ContentValues(); + long createdTime = System.currentTimeMillis(); + values.put(NoteColumns.CREATED_DATE, createdTime); + values.put(NoteColumns.MODIFIED_DATE, createdTime); + values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + values.put(NoteColumns.PARENT_ID, folderId); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + + long noteId = 0; + try { + noteId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + noteId = 0; + } + if (noteId == -1) { + throw new IllegalStateException("Wrong note id:" + noteId); + } + return noteId; + } + + public Note() { + mNoteDiffValues = new ContentValues(); + mNoteData = new NoteData(); + } + + public void setNoteValue(String key, String value) { + mNoteDiffValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + public void setTextData(String key, String value) { + mNoteData.setTextData(key, value); + } + + public void setTextDataId(long id) { + mNoteData.setTextDataId(id); + } + + public long getTextDataId() { + return mNoteData.mTextDataId; + } + + public void setCallDataId(long id) { + mNoteData.setCallDataId(id); + } + + public void setCallData(String key, String value) { + mNoteData.setCallData(key, value); + } + + public boolean isLocalModified() { + return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); + } + + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + if (!isLocalModified()) { + return true; + } + + /** + * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and + * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the + * note data info + */ + if (context.getContentResolver().update( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, + null) == 0) { + Log.e(TAG, "Update note error, should not happen"); + // Do not return, fall through + } + mNoteDiffValues.clear(); + + if (mNoteData.isLocalModified() + && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + return false; + } + + return true; + } + + private class NoteData { + private long mTextDataId; + + private ContentValues mTextDataValues; + + private long mCallDataId; + + private ContentValues mCallDataValues; + + private static final String TAG = "NoteData"; + + public NoteData() { + mTextDataValues = new ContentValues(); + mCallDataValues = new ContentValues(); + mTextDataId = 0; + mCallDataId = 0; + } + + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("Text data id should larger than 0"); + } + mTextDataId = id; + } + + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("Call data id should larger than 0"); + } + mCallDataId = id; + } + + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * Check for safety + */ + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + ArrayList operationList = new ArrayList(); + ContentProviderOperation.Builder builder = null; + + if(mTextDataValues.size() > 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId); + if (mTextDataId == 0) { + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new text data fail with noteId" + noteId); + mTextDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); + } + + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); + if (mCallDataId == 0) { + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new call data fail with noteId" + noteId); + mCallDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); + } + + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } + } + return null; + } + } +} diff --git a/src/notes/model/WorkingNote.java b/src/notes/model/WorkingNote.java new file mode 100644 index 0000000..be081e4 --- /dev/null +++ b/src/notes/model/WorkingNote.java @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.model; + +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.tool.ResourceParser.NoteBgResources; + + +public class WorkingNote { + // Note for the working note + private Note mNote; + // Note Id + private long mNoteId; + // Note content + private String mContent; + // Note mode + private int mMode; + + private long mAlertDate; + + private long mModifiedDate; + + private int mBgColorId; + + private int mWidgetId; + + private int mWidgetType; + + private long mFolderId; + + private Context mContext; + + private static final String TAG = "WorkingNote"; + + private boolean mIsDeleted; + + private NoteSettingChangedListener mNoteSettingStatusListener; + + public static final String[] DATA_PROJECTION = new String[] { + DataColumns.ID, + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + public static final String[] NOTE_PROJECTION = new String[] { + NoteColumns.PARENT_ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + NoteColumns.MODIFIED_DATE + }; + + private static final int DATA_ID_COLUMN = 0; + + private static final int DATA_CONTENT_COLUMN = 1; + + private static final int DATA_MIME_TYPE_COLUMN = 2; + + private static final int DATA_MODE_COLUMN = 3; + + private static final int NOTE_PARENT_ID_COLUMN = 0; + + private static final int NOTE_ALERTED_DATE_COLUMN = 1; + + private static final int NOTE_BG_COLOR_ID_COLUMN = 2; + + private static final int NOTE_WIDGET_ID_COLUMN = 3; + + private static final int NOTE_WIDGET_TYPE_COLUMN = 4; + + private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + + // New note construct + private WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; + mModifiedDate = System.currentTimeMillis(); + mFolderId = folderId; + mNote = new Note(); + mNoteId = 0; + mIsDeleted = false; + mMode = 0; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + } + + // Existing note construct + private WorkingNote(Context context, long noteId, long folderId) { + mContext = context; + mNoteId = noteId; + mFolderId = folderId; + mIsDeleted = false; + mNote = new Note(); + loadNote(); + } + + private void loadNote() { + Cursor cursor = mContext.getContentResolver().query( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, + null, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); + mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); + mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); + mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); + mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + } + cursor.close(); + } else { + Log.e(TAG, "No note with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note with id " + mNoteId); + } + loadNoteData(); + } + + private void loadNoteData() { + Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, + DataColumns.NOTE_ID + "=?", new String[] { + String.valueOf(mNoteId) + }, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + if (DataConstants.NOTE.equals(type)) { + mContent = cursor.getString(DATA_CONTENT_COLUMN); + mMode = cursor.getInt(DATA_MODE_COLUMN); + mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); + } else if (DataConstants.CALL_NOTE.equals(type)) { + mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); + } else { + Log.d(TAG, "Wrong note type with type:" + type); + } + } while (cursor.moveToNext()); + } + cursor.close(); + } else { + Log.e(TAG, "No data with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); + } + } + + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + note.setBgColorId(defaultBgColorId); + note.setWidgetId(widgetId); + note.setWidgetType(widgetType); + return note; + } + + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + public synchronized boolean saveNote() { + if (isWorthSaving()) { + if (!existInDatabase()) { + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + mNote.syncNote(mContext, mNoteId); + + /** + * Update widget content if there exist any widget of this note + */ + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE + && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + public boolean existInDatabase() { + return mNoteId > 0; + } + + private boolean isWorthSaving() { + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; + } else { + return true; + } + } + + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + public void markDeleted(boolean mark) { + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + } + + public void setBgColorId(int id) { + if (id != mBgColorId) { + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + public void setCheckListMode(int mode) { + if (mMode != mode) { + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + public void setWidgetType(int type) { + if (type != mWidgetType) { + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + } + } + + public void setWidgetId(int id) { + if (id != mWidgetId) { + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + } + } + + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) { + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + public String getContent() { + return mContent; + } + + public long getAlertDate() { + return mAlertDate; + } + + public long getModifiedDate() { + return mModifiedDate; + } + + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + public int getBgColorId() { + return mBgColorId; + } + + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + public int getCheckListMode() { + return mMode; + } + + public long getNoteId() { + return mNoteId; + } + + public long getFolderId() { + return mFolderId; + } + + public int getWidgetId() { + return mWidgetId; + } + + public int getWidgetType() { + return mWidgetType; + } + + public interface NoteSettingChangedListener { + /** + * Called when the background color of current note has just changed + */ + void onBackgroundColorChanged(); + + /** + * Called when user set clock + */ + void onClockAlertChanged(long date, boolean set); + + /** + * Call when user create note from widget + */ + void onWidgetChanged(); + + /** + * Call when switch between check list mode and normal mode + * @param oldMode is previous mode before change + * @param newMode is new mode + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} diff --git a/src/notes/tool/BackupUtils.java b/src/notes/tool/BackupUtils.java new file mode 100644 index 0000000..39f6ec4 --- /dev/null +++ b/src/notes/tool/BackupUtils.java @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.database.Cursor; +import android.os.Environment; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; + + +public class BackupUtils { + private static final String TAG = "BackupUtils"; + // Singleton stuff + private static BackupUtils sInstance; + + public static synchronized BackupUtils getInstance(Context context) { + if (sInstance == null) { + sInstance = new BackupUtils(context); + } + return sInstance; + } + + /** + * Following states are signs to represents backup or restore + * status + */ + // Currently, the sdcard is not mounted + public static final int STATE_SD_CARD_UNMOUONTED = 0; + // The backup file not exist + public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; + // The data is not well formated, may be changed by other programs + public static final int STATE_DATA_DESTROIED = 2; + // Some run-time exception which causes restore or backup fails + public static final int STATE_SYSTEM_ERROR = 3; + // Backup or restore success + public static final int STATE_SUCCESS = 4; + + private TextExport mTextExport; + + private BackupUtils(Context context) { + mTextExport = new TextExport(context); + } + + private static boolean externalStorageAvailable() { + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + public int exportToText() { + return mTextExport.exportToText(); + } + + public String getExportedTextFileName() { + return mTextExport.mFileName; + } + + public String getExportedTextFileDir() { + return mTextExport.mFileDirectory; + } + + private static class TextExport { + private static final String[] NOTE_PROJECTION = { + NoteColumns.ID, + NoteColumns.MODIFIED_DATE, + NoteColumns.SNIPPET, + NoteColumns.TYPE + }; + + private static final int NOTE_COLUMN_ID = 0; + + private static final int NOTE_COLUMN_MODIFIED_DATE = 1; + + private static final int NOTE_COLUMN_SNIPPET = 2; + + private static final String[] DATA_PROJECTION = { + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + private static final int DATA_COLUMN_CONTENT = 0; + + private static final int DATA_COLUMN_MIME_TYPE = 1; + + private static final int DATA_COLUMN_CALL_DATE = 2; + + private static final int DATA_COLUMN_PHONE_NUMBER = 4; + + private final String [] TEXT_FORMAT; + private static final int FORMAT_FOLDER_NAME = 0; + private static final int FORMAT_NOTE_DATE = 1; + private static final int FORMAT_NOTE_CONTENT = 2; + + private Context mContext; + private String mFileName; + private String mFileDirectory; + + public TextExport(Context context) { + TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + mContext = context; + mFileName = ""; + mFileDirectory = ""; + } + + private String getFormat(int id) { + return TEXT_FORMAT[id]; + } + + /** + * Export the folder identified by folder id to text + */ + private void exportFolderToText(String folderId, PrintStream ps) { + // Query notes belong to this folder + Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { + folderId + }, null); + + if (notesCursor != null) { + if (notesCursor.moveToFirst()) { + do { + // Print note's last modified date + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = notesCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (notesCursor.moveToNext()); + } + notesCursor.close(); + } + } + + /** + * Export note identified by id to a print stream + */ + private void exportNoteToText(String noteId, PrintStream ps) { + Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, + DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { + noteId + }, null); + + if (dataCursor != null) { + if (dataCursor.moveToFirst()) { + do { + String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); + if (DataConstants.CALL_NOTE.equals(mimeType)) { + // Print phone number + String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); + long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); + String location = dataCursor.getString(DATA_COLUMN_CONTENT); + + if (!TextUtils.isEmpty(phoneNumber)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + phoneNumber)); + } + // Print call date + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat + .format(mContext.getString(R.string.format_datetime_mdhm), + callDate))); + // Print call attachment location + if (!TextUtils.isEmpty(location)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + location)); + } + } else if (DataConstants.NOTE.equals(mimeType)) { + String content = dataCursor.getString(DATA_COLUMN_CONTENT); + if (!TextUtils.isEmpty(content)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + content)); + } + } + } while (dataCursor.moveToNext()); + } + dataCursor.close(); + } + // print a line separator between note + try { + ps.write(new byte[] { + Character.LINE_SEPARATOR, Character.LETTER_NUMBER + }); + } catch (IOException e) { + Log.e(TAG, e.toString()); + } + } + + /** + * Note will be exported as text which is user readable + */ + public int exportToText() { + if (!externalStorageAvailable()) { + Log.d(TAG, "Media was not mounted"); + return STATE_SD_CARD_UNMOUONTED; + } + + PrintStream ps = getExportToTextPrintStream(); + if (ps == null) { + Log.e(TAG, "get print stream error"); + return STATE_SYSTEM_ERROR; + } + // First export folder and its notes + Cursor folderCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); + + if (folderCursor != null) { + if (folderCursor.moveToFirst()) { + do { + // Print folder's name + String folderName = ""; + if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { + folderName = mContext.getString(R.string.call_record_folder_name); + } else { + folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); + } + if (!TextUtils.isEmpty(folderName)) { + ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); + } + String folderId = folderCursor.getString(NOTE_COLUMN_ID); + exportFolderToText(folderId, ps); + } while (folderCursor.moveToNext()); + } + folderCursor.close(); + } + + // Export notes in root's folder + Cursor noteCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID + + "=0", null, null); + + if (noteCursor != null) { + if (noteCursor.moveToFirst()) { + do { + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = noteCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (noteCursor.moveToNext()); + } + noteCursor.close(); + } + ps.close(); + + return STATE_SUCCESS; + } + + /** + * Get a print stream pointed to the file {@generateExportedTextFile} + */ + private PrintStream getExportToTextPrintStream() { + File file = generateFileMountedOnSDcard(mContext, R.string.file_path, + R.string.file_name_txt_format); + if (file == null) { + Log.e(TAG, "create file to exported failed"); + return null; + } + mFileName = file.getName(); + mFileDirectory = mContext.getString(R.string.file_path); + PrintStream ps = null; + try { + FileOutputStream fos = new FileOutputStream(file); + ps = new PrintStream(fos); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } catch (NullPointerException e) { + e.printStackTrace(); + return null; + } + return ps; + } + } + + /** + * Generate the text file to store imported data + */ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); + sb.append(context.getString(filePathResId)); + File filedir = new File(sb.toString()); + sb.append(context.getString( + fileNameFormatResId, + DateFormat.format(context.getString(R.string.format_date_ymd), + System.currentTimeMillis()))); + File file = new File(sb.toString()); + + try { + if (!filedir.exists()) { + filedir.mkdir(); + } + if (!file.exists()) { + file.createNewFile(); + } + return file; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } +} + + diff --git a/src/notes/tool/DataUtils.java b/src/notes/tool/DataUtils.java new file mode 100644 index 0000000..2a14982 --- /dev/null +++ b/src/notes/tool/DataUtils.java @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.OperationApplicationException; +import android.database.Cursor; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; + +import java.util.ArrayList; +import java.util.HashSet; + + +public class DataUtils { + public static final String TAG = "DataUtils"; + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + if (ids.size() == 0) { + Log.d(TAG, "no id is in the hashset"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + if(id == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Don't delete system folder root"); + continue; + } + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + operationList.add(builder.build()); + } + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); + } + + public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, + long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + builder.withValue(NoteColumns.PARENT_ID, folderId); + builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); + operationList.add(builder.build()); + } + + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + /** + * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + */ + public static int getUserFolderCount(ContentResolver resolver) { + Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { "COUNT(*)" }, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, + null); + + int count = 0; + if(cursor != null) { + if(cursor.moveToFirst()) { + try { + count = cursor.getInt(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "get folder count failed:" + e.toString()); + } finally { + cursor.close(); + } + } + } + return count; + } + + public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, + NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, + new String [] {String.valueOf(type)}, + null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", + new String[] { name }, null); + boolean exist = false; + if(cursor != null) { + if(cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + NoteColumns.PARENT_ID + "=?", + new String[] { String.valueOf(folderId) }, + null); + + HashSet set = null; + if (c != null) { + if (c.moveToFirst()) { + set = new HashSet(); + do { + try { + AppWidgetAttribute widget = new AppWidgetAttribute(); + widget.widgetId = c.getInt(0); + widget.widgetType = c.getInt(1); + set.add(widget); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, e.toString()); + } + } while (c.moveToNext()); + } + c.close(); + } + return set; + } + + public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", + new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + null); + + if (cursor != null && cursor.moveToFirst()) { + try { + return cursor.getString(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call number fails " + e.toString()); + } finally { + cursor.close(); + } + } + return ""; + } + + public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.NOTE_ID }, + CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" + + CallNote.PHONE_NUMBER + ",?)", + new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, + null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + try { + return cursor.getLong(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call note id fails " + e.toString()); + } + } + cursor.close(); + } + return 0; + } + + public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + NoteColumns.ID + "=?", + new String [] { String.valueOf(noteId)}, + null); + + if (cursor != null) { + String snippet = ""; + if (cursor.moveToFirst()) { + snippet = cursor.getString(0); + } + cursor.close(); + return snippet; + } + throw new IllegalArgumentException("Note is not found with id: " + noteId); + } + + public static String getFormattedSnippet(String snippet) { + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); + } + } + return snippet; + } +} diff --git a/src/notes/tool/GTaskStringUtils.java b/src/notes/tool/GTaskStringUtils.java new file mode 100644 index 0000000..666b729 --- /dev/null +++ b/src/notes/tool/GTaskStringUtils.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +public class GTaskStringUtils { + + public final static String GTASK_JSON_ACTION_ID = "action_id"; + + public final static String GTASK_JSON_ACTION_LIST = "action_list"; + + public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + + public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; + + public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; + + public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; + + public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; + + public final static String GTASK_JSON_CREATOR_ID = "creator_id"; + + public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; + + public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; + + public final static String GTASK_JSON_COMPLETED = "completed"; + + public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; + + public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; + + public final static String GTASK_JSON_DELETED = "deleted"; + + public final static String GTASK_JSON_DEST_LIST = "dest_list"; + + public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; + + public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; + + public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; + + public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; + + public final static String GTASK_JSON_GET_DELETED = "get_deleted"; + + public final static String GTASK_JSON_ID = "id"; + + public final static String GTASK_JSON_INDEX = "index"; + + public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; + + public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; + + public final static String GTASK_JSON_LIST_ID = "list_id"; + + public final static String GTASK_JSON_LISTS = "lists"; + + public final static String GTASK_JSON_NAME = "name"; + + public final static String GTASK_JSON_NEW_ID = "new_id"; + + public final static String GTASK_JSON_NOTES = "notes"; + + public final static String GTASK_JSON_PARENT_ID = "parent_id"; + + public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; + + public final static String GTASK_JSON_RESULTS = "results"; + + public final static String GTASK_JSON_SOURCE_LIST = "source_list"; + + public final static String GTASK_JSON_TASKS = "tasks"; + + public final static String GTASK_JSON_TYPE = "type"; + + public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; + + public final static String GTASK_JSON_TYPE_TASK = "TASK"; + + public final static String GTASK_JSON_USER = "user"; + + public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + + public final static String FOLDER_DEFAULT = "Default"; + + public final static String FOLDER_CALL_NOTE = "Call_Note"; + + public final static String FOLDER_META = "METADATA"; + + public final static String META_HEAD_GTASK_ID = "meta_gid"; + + public final static String META_HEAD_NOTE = "meta_note"; + + public final static String META_HEAD_DATA = "meta_data"; + + public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; + +} diff --git a/src/notes/tool/ResourceParser.java b/src/notes/tool/ResourceParser.java new file mode 100644 index 0000000..1ad3ad6 --- /dev/null +++ b/src/notes/tool/ResourceParser.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.preference.PreferenceManager; + +import net.micode.notes.R; +import net.micode.notes.ui.NotesPreferenceActivity; + +public class ResourceParser { + + public static final int YELLOW = 0; + public static final int BLUE = 1; + public static final int WHITE = 2; + public static final int GREEN = 3; + public static final int RED = 4; + + public static final int BG_DEFAULT_COLOR = YELLOW; + + public static final int TEXT_SMALL = 0; + public static final int TEXT_MEDIUM = 1; + public static final int TEXT_LARGE = 2; + public static final int TEXT_SUPER = 3; + + public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + + public static class NoteBgResources { + private final static int [] BG_EDIT_RESOURCES = new int [] { + R.drawable.edit_yellow, + R.drawable.edit_blue, + R.drawable.edit_white, + R.drawable.edit_green, + R.drawable.edit_red + }; + + private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { + R.drawable.edit_title_yellow, + R.drawable.edit_title_blue, + R.drawable.edit_title_white, + R.drawable.edit_title_green, + R.drawable.edit_title_red + }; + + public static int getNoteBgResource(int id) { + return BG_EDIT_RESOURCES[id]; + } + + public static int getNoteTitleBgResource(int id) { + return BG_EDIT_TITLE_RESOURCES[id]; + } + } + + public static int getDefaultBgId(Context context) { + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( + NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); + } else { + return BG_DEFAULT_COLOR; + } + } + + public static class NoteItemBgResources { + private final static int [] BG_FIRST_RESOURCES = new int [] { + R.drawable.list_yellow_up, + R.drawable.list_blue_up, + R.drawable.list_white_up, + R.drawable.list_green_up, + R.drawable.list_red_up + }; + + private final static int [] BG_NORMAL_RESOURCES = new int [] { + R.drawable.list_yellow_middle, + R.drawable.list_blue_middle, + R.drawable.list_white_middle, + R.drawable.list_green_middle, + R.drawable.list_red_middle + }; + + private final static int [] BG_LAST_RESOURCES = new int [] { + R.drawable.list_yellow_down, + R.drawable.list_blue_down, + R.drawable.list_white_down, + R.drawable.list_green_down, + R.drawable.list_red_down, + }; + + private final static int [] BG_SINGLE_RESOURCES = new int [] { + R.drawable.list_yellow_single, + R.drawable.list_blue_single, + R.drawable.list_white_single, + R.drawable.list_green_single, + R.drawable.list_red_single + }; + + public static int getNoteBgFirstRes(int id) { + return BG_FIRST_RESOURCES[id]; + } + + public static int getNoteBgLastRes(int id) { + return BG_LAST_RESOURCES[id]; + } + + public static int getNoteBgSingleRes(int id) { + return BG_SINGLE_RESOURCES[id]; + } + + public static int getNoteBgNormalRes(int id) { + return BG_NORMAL_RESOURCES[id]; + } + + public static int getFolderBgRes() { + return R.drawable.list_folder; + } + } + + public static class WidgetBgResources { + private final static int [] BG_2X_RESOURCES = new int [] { + R.drawable.widget_2x_yellow, + R.drawable.widget_2x_blue, + R.drawable.widget_2x_white, + R.drawable.widget_2x_green, + R.drawable.widget_2x_red, + }; + + public static int getWidget2xBgResource(int id) { + return BG_2X_RESOURCES[id]; + } + + private final static int [] BG_4X_RESOURCES = new int [] { + R.drawable.widget_4x_yellow, + R.drawable.widget_4x_blue, + R.drawable.widget_4x_white, + R.drawable.widget_4x_green, + R.drawable.widget_4x_red + }; + + public static int getWidget4xBgResource(int id) { + return BG_4X_RESOURCES[id]; + } + } + + public static class TextAppearanceResources { + private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper + }; + + public static int getTexAppearanceResource(int id) { + /** + * HACKME: Fix bug of store the resource id in shared preference. + * The id may larger than the length of resources, in this case, + * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + */ + if (id >= TEXTAPPEARANCE_RESOURCES.length) { + return BG_DEFAULT_FONT_SIZE; + } + return TEXTAPPEARANCE_RESOURCES[id]; + } + + public static int getResourcesSize() { + return TEXTAPPEARANCE_RESOURCES.length; + } + } +} diff --git a/src/notes/ui/AlarmAlertActivity.java b/src/notes/ui/AlarmAlertActivity.java new file mode 100644 index 0000000..85723be --- /dev/null +++ b/src/notes/ui/AlarmAlertActivity.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.PowerManager; +import android.provider.Settings; +import android.view.Window; +import android.view.WindowManager; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.DataUtils; + +import java.io.IOException; + + +public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { + private long mNoteId; + private String mSnippet; + private static final int SNIPPET_PREW_MAX_LEN = 60; + MediaPlayer mPlayer; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + final Window win = getWindow(); + win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + + if (!isScreenOn()) { + win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); + } + + Intent intent = getIntent(); + + try { + mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); + mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, + SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) + : mSnippet; + } catch (IllegalArgumentException e) { + e.printStackTrace(); + return; + } + + mPlayer = new MediaPlayer(); + if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { + showActionDialog(); + playAlarmSound(); + } else { + finish(); + } + } + + private boolean isScreenOn() { + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + return pm.isScreenOn(); + } + + private void playAlarmSound() { + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + + int silentModeStreams = Settings.System.getInt(getContentResolver(), + Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); + + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { + mPlayer.setAudioStreamType(silentModeStreams); + } else { + mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); + } + try { + mPlayer.setDataSource(this, url); + mPlayer.prepare(); + mPlayer.setLooping(true); + mPlayer.start(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalStateException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void showActionDialog() { + AlertDialog.Builder dialog = new AlertDialog.Builder(this); + dialog.setTitle(R.string.app_name); + dialog.setMessage(mSnippet); + dialog.setPositiveButton(R.string.notealert_ok, this); + if (isScreenOn()) { + dialog.setNegativeButton(R.string.notealert_enter, this); + } + dialog.show().setOnDismissListener(this); + } + + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_NEGATIVE: + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, mNoteId); + startActivity(intent); + break; + default: + break; + } + } + + public void onDismiss(DialogInterface dialog) { + stopAlarmSound(); + finish(); + } + + private void stopAlarmSound() { + if (mPlayer != null) { + mPlayer.stop(); + mPlayer.release(); + mPlayer = null; + } + } +} diff --git a/src/notes/ui/AlarmInitReceiver.java b/src/notes/ui/AlarmInitReceiver.java new file mode 100644 index 0000000..f221202 --- /dev/null +++ b/src/notes/ui/AlarmInitReceiver.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; + + +public class AlarmInitReceiver extends BroadcastReceiver { + + private static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.ALERTED_DATE + }; + + private static final int COLUMN_ID = 0; + private static final int COLUMN_ALERTED_DATE = 1; + + @Override + public void onReceive(Context context, Intent intent) { + long currentDate = System.currentTimeMillis(); + Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, + new String[] { String.valueOf(currentDate) }, + null); + + if (c != null) { + if (c.moveToFirst()) { + do { + long alertDate = c.getLong(COLUMN_ALERTED_DATE); + Intent sender = new Intent(context, AlarmReceiver.class); + sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); + AlarmManager alermManager = (AlarmManager) context + .getSystemService(Context.ALARM_SERVICE); + alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + } while (c.moveToNext()); + } + c.close(); + } + } +} diff --git a/src/notes/ui/AlarmReceiver.java b/src/notes/ui/AlarmReceiver.java new file mode 100644 index 0000000..54e503b --- /dev/null +++ b/src/notes/ui/AlarmReceiver.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class AlarmReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + intent.setClass(context, AlarmAlertActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } +} diff --git a/src/notes/ui/DateTimePicker.java b/src/notes/ui/DateTimePicker.java new file mode 100644 index 0000000..496b0cd --- /dev/null +++ b/src/notes/ui/DateTimePicker.java @@ -0,0 +1,485 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import java.text.DateFormatSymbols; +import java.util.Calendar; + +import net.micode.notes.R; + + +import android.content.Context; +import android.text.format.DateFormat; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.NumberPicker; + +public class DateTimePicker extends FrameLayout { + + private static final boolean DEFAULT_ENABLE_STATE = true; + + private static final int HOURS_IN_HALF_DAY = 12; + private static final int HOURS_IN_ALL_DAY = 24; + private static final int DAYS_IN_ALL_WEEK = 7; + private static final int DATE_SPINNER_MIN_VAL = 0; + private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; + private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; + private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; + private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; + private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; + private static final int MINUT_SPINNER_MIN_VAL = 0; + private static final int MINUT_SPINNER_MAX_VAL = 59; + private static final int AMPM_SPINNER_MIN_VAL = 0; + private static final int AMPM_SPINNER_MAX_VAL = 1; + + private final NumberPicker mDateSpinner; + private final NumberPicker mHourSpinner; + private final NumberPicker mMinuteSpinner; + private final NumberPicker mAmPmSpinner; + private Calendar mDate; + + private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; + + private boolean mIsAm; + + private boolean mIs24HourView; + + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; + + private boolean mInitialising; + + private OnDateTimeChangedListener mOnDateTimeChangedListener; + + private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); + updateDateControl(); + onDateTimeChanged(); + } + }; + + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + boolean isDateChanged = false; + Calendar cal = Calendar.getInstance(); + if (!mIs24HourView) { + if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || + oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { + mIsAm = !mIsAm; + updateAmPmControl(); + } + } else { + if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + isDateChanged = true; + } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -1); + isDateChanged = true; + } + } + int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + mDate.set(Calendar.HOUR_OF_DAY, newHour); + onDateTimeChanged(); + if (isDateChanged) { + setCurrentYear(cal.get(Calendar.YEAR)); + setCurrentMonth(cal.get(Calendar.MONTH)); + setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); + } + } + }; + + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + int minValue = mMinuteSpinner.getMinValue(); + int maxValue = mMinuteSpinner.getMaxValue(); + int offset = 0; + if (oldVal == maxValue && newVal == minValue) { + offset += 1; + } else if (oldVal == minValue && newVal == maxValue) { + offset -= 1; + } + if (offset != 0) { + mDate.add(Calendar.HOUR_OF_DAY, offset); + mHourSpinner.setValue(getCurrentHour()); + updateDateControl(); + int newHour = getCurrentHourOfDay(); + if (newHour >= HOURS_IN_HALF_DAY) { + mIsAm = false; + updateAmPmControl(); + } else { + mIsAm = true; + updateAmPmControl(); + } + } + mDate.set(Calendar.MINUTE, newVal); + onDateTimeChanged(); + } + }; + + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + mIsAm = !mIsAm; + if (mIsAm) { + mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); + } else { + mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); + } + updateAmPmControl(); + onDateTimeChanged(); + } + }; + + public interface OnDateTimeChangedListener { + void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute); + } + + public DateTimePicker(Context context) { + this(context, System.currentTimeMillis()); + } + + public DateTimePicker(Context context, long date) { + this(context, date, DateFormat.is24HourFormat(context)); + } + + public DateTimePicker(Context context, long date, boolean is24HourView) { + super(context); + mDate = Calendar.getInstance(); + mInitialising = true; + mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; + inflate(context, R.layout.datetime_picker, this); + + mDateSpinner = (NumberPicker) findViewById(R.id.date); + mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); + mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); + mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); + + mHourSpinner = (NumberPicker) findViewById(R.id.hour); + mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); + mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); + mMinuteSpinner.setOnLongPressUpdateInterval(100); + mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); + + String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); + mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); + mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); + mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); + mAmPmSpinner.setDisplayedValues(stringsForAmPm); + mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); + + // update controls to initial state + updateDateControl(); + updateHourControl(); + updateAmPmControl(); + + set24HourView(is24HourView); + + // set to current time + setCurrentDate(date); + + setEnabled(isEnabled()); + + // set the content descriptions + mInitialising = false; + } + + @Override + public void setEnabled(boolean enabled) { + if (mIsEnabled == enabled) { + return; + } + super.setEnabled(enabled); + mDateSpinner.setEnabled(enabled); + mMinuteSpinner.setEnabled(enabled); + mHourSpinner.setEnabled(enabled); + mAmPmSpinner.setEnabled(enabled); + mIsEnabled = enabled; + } + + @Override + public boolean isEnabled() { + return mIsEnabled; + } + + /** + * Get the current date in millis + * + * @return the current date in millis + */ + public long getCurrentDateInTimeMillis() { + return mDate.getTimeInMillis(); + } + + /** + * Set the current date + * + * @param date The current date in millis + */ + public void setCurrentDate(long date) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(date); + setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), + cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); + } + + /** + * Set the current date + * + * @param year The current year + * @param month The current month + * @param dayOfMonth The current dayOfMonth + * @param hourOfDay The current hourOfDay + * @param minute The current minute + */ + public void setCurrentDate(int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + setCurrentYear(year); + setCurrentMonth(month); + setCurrentDay(dayOfMonth); + setCurrentHour(hourOfDay); + setCurrentMinute(minute); + } + + /** + * Get current year + * + * @return The current year + */ + public int getCurrentYear() { + return mDate.get(Calendar.YEAR); + } + + /** + * Set current year + * + * @param year The current year + */ + public void setCurrentYear(int year) { + if (!mInitialising && year == getCurrentYear()) { + return; + } + mDate.set(Calendar.YEAR, year); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current month in the year + * + * @return The current month in the year + */ + public int getCurrentMonth() { + return mDate.get(Calendar.MONTH); + } + + /** + * Set current month in the year + * + * @param month The month in the year + */ + public void setCurrentMonth(int month) { + if (!mInitialising && month == getCurrentMonth()) { + return; + } + mDate.set(Calendar.MONTH, month); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current day of the month + * + * @return The day of the month + */ + public int getCurrentDay() { + return mDate.get(Calendar.DAY_OF_MONTH); + } + + /** + * Set current day of the month + * + * @param dayOfMonth The day of the month + */ + public void setCurrentDay(int dayOfMonth) { + if (!mInitialising && dayOfMonth == getCurrentDay()) { + return; + } + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * Get current hour in 24 hour mode, in the range (0~23) + * @return The current hour in 24 hour mode + */ + public int getCurrentHourOfDay() { + return mDate.get(Calendar.HOUR_OF_DAY); + } + + private int getCurrentHour() { + if (mIs24HourView){ + return getCurrentHourOfDay(); + } else { + int hour = getCurrentHourOfDay(); + if (hour > HOURS_IN_HALF_DAY) { + return hour - HOURS_IN_HALF_DAY; + } else { + return hour == 0 ? HOURS_IN_HALF_DAY : hour; + } + } + } + + /** + * Set current hour in 24 hour mode, in the range (0~23) + * + * @param hourOfDay + */ + public void setCurrentHour(int hourOfDay) { + if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { + return; + } + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + if (!mIs24HourView) { + if (hourOfDay >= HOURS_IN_HALF_DAY) { + mIsAm = false; + if (hourOfDay > HOURS_IN_HALF_DAY) { + hourOfDay -= HOURS_IN_HALF_DAY; + } + } else { + mIsAm = true; + if (hourOfDay == 0) { + hourOfDay = HOURS_IN_HALF_DAY; + } + } + updateAmPmControl(); + } + mHourSpinner.setValue(hourOfDay); + onDateTimeChanged(); + } + + /** + * Get currentMinute + * + * @return The Current Minute + */ + public int getCurrentMinute() { + return mDate.get(Calendar.MINUTE); + } + + /** + * Set current minute + */ + public void setCurrentMinute(int minute) { + if (!mInitialising && minute == getCurrentMinute()) { + return; + } + mMinuteSpinner.setValue(minute); + mDate.set(Calendar.MINUTE, minute); + onDateTimeChanged(); + } + + /** + * @return true if this is in 24 hour view else false. + */ + public boolean is24HourView () { + return mIs24HourView; + } + + /** + * Set whether in 24 hour or AM/PM mode. + * + * @param is24HourView True for 24 hour mode. False for AM/PM mode. + */ + public void set24HourView(boolean is24HourView) { + if (mIs24HourView == is24HourView) { + return; + } + mIs24HourView = is24HourView; + mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); + int hour = getCurrentHourOfDay(); + updateHourControl(); + setCurrentHour(hour); + updateAmPmControl(); + } + + private void updateDateControl() { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); + mDateSpinner.setDisplayedValues(null); + for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { + cal.add(Calendar.DAY_OF_YEAR, 1); + mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); + } + mDateSpinner.setDisplayedValues(mDateDisplayValues); + mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); + mDateSpinner.invalidate(); + } + + private void updateAmPmControl() { + if (mIs24HourView) { + mAmPmSpinner.setVisibility(View.GONE); + } else { + int index = mIsAm ? Calendar.AM : Calendar.PM; + mAmPmSpinner.setValue(index); + mAmPmSpinner.setVisibility(View.VISIBLE); + } + } + + private void updateHourControl() { + if (mIs24HourView) { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); + } else { + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); + } + } + + /** + * Set the callback that indicates the 'Set' button has been pressed. + * @param callback the callback, if null will do nothing + */ + public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { + mOnDateTimeChangedListener = callback; + } + + private void onDateTimeChanged() { + if (mOnDateTimeChangedListener != null) { + mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), + getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); + } + } +} diff --git a/src/notes/ui/DateTimePickerDialog.java b/src/notes/ui/DateTimePickerDialog.java new file mode 100644 index 0000000..2c47ba4 --- /dev/null +++ b/src/notes/ui/DateTimePickerDialog.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import java.util.Calendar; + +import net.micode.notes.R; +import net.micode.notes.ui.DateTimePicker; +import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.text.format.DateFormat; +import android.text.format.DateUtils; + +public class DateTimePickerDialog extends AlertDialog implements OnClickListener { + + private Calendar mDate = Calendar.getInstance(); + private boolean mIs24HourView; + private OnDateTimeSetListener mOnDateTimeSetListener; + private DateTimePicker mDateTimePicker; + + public interface OnDateTimeSetListener { + void OnDateTimeSet(AlertDialog dialog, long date); + } + + public DateTimePickerDialog(Context context, long date) { + super(context); + mDateTimePicker = new DateTimePicker(context); + setView(mDateTimePicker); + mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { + public void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + mDate.set(Calendar.YEAR, year); + mDate.set(Calendar.MONTH, month); + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + mDate.set(Calendar.MINUTE, minute); + updateTitle(mDate.getTimeInMillis()); + } + }); + mDate.setTimeInMillis(date); + mDate.set(Calendar.SECOND, 0); + mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); + setButton(context.getString(R.string.datetime_dialog_ok), this); + setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + set24HourView(DateFormat.is24HourFormat(this.getContext())); + updateTitle(mDate.getTimeInMillis()); + } + + public void set24HourView(boolean is24HourView) { + mIs24HourView = is24HourView; + } + + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { + mOnDateTimeSetListener = callBack; + } + + private void updateTitle(long date) { + int flag = + DateUtils.FORMAT_SHOW_YEAR | + DateUtils.FORMAT_SHOW_DATE | + DateUtils.FORMAT_SHOW_TIME; + flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; + setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); + } + + public void onClick(DialogInterface arg0, int arg1) { + if (mOnDateTimeSetListener != null) { + mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); + } + } + +} \ No newline at end of file diff --git a/src/notes/ui/DropdownMenu.java b/src/notes/ui/DropdownMenu.java new file mode 100644 index 0000000..613dc74 --- /dev/null +++ b/src/notes/ui/DropdownMenu.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.PopupMenu; +import android.widget.PopupMenu.OnMenuItemClickListener; + +import net.micode.notes.R; + +public class DropdownMenu { + private Button mButton; + private PopupMenu mPopupMenu; + private Menu mMenu; + + public DropdownMenu(Context context, Button button, int menuId) { + mButton = button; + mButton.setBackgroundResource(R.drawable.dropdown_icon); + mPopupMenu = new PopupMenu(context, mButton); + mMenu = mPopupMenu.getMenu(); + mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + mButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + mPopupMenu.show(); + } + }); + } + + public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { + if (mPopupMenu != null) { + mPopupMenu.setOnMenuItemClickListener(listener); + } + } + + public MenuItem findItem(int id) { + return mMenu.findItem(id); + } + + public void setTitle(CharSequence title) { + mButton.setText(title); + } +} diff --git a/src/notes/ui/FoldersListAdapter.java b/src/notes/ui/FoldersListAdapter.java new file mode 100644 index 0000000..96b77da --- /dev/null +++ b/src/notes/ui/FoldersListAdapter.java @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; + + +public class FoldersListAdapter extends CursorAdapter { + public static final String [] PROJECTION = { + NoteColumns.ID, + NoteColumns.SNIPPET + }; + + public static final int ID_COLUMN = 0; + public static final int NAME_COLUMN = 1; + + public FoldersListAdapter(Context context, Cursor c) { + super(context, c); + // TODO Auto-generated constructor stub + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return new FolderListItem(context); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + if (view instanceof FolderListItem) { + String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + ((FolderListItem) view).bind(folderName); + } + } + + public String getFolderName(Context context, int position) { + Cursor cursor = (Cursor) getItem(position); + return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + } + + private class FolderListItem extends LinearLayout { + private TextView mName; + + public FolderListItem(Context context) { + super(context); + inflate(context, R.layout.folder_list_item, this); + mName = (TextView) findViewById(R.id.tv_folder_name); + } + + public void bind(String name) { + mName.setText(name); + } + } + +} diff --git a/src/notes/ui/NoteEditActivity.java b/src/notes/ui/NoteEditActivity.java new file mode 100644 index 0000000..96a9ff8 --- /dev/null +++ b/src/notes/ui/NoteEditActivity.java @@ -0,0 +1,873 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlarmManager; +import android.app.AlertDialog; +import android.app.PendingIntent; +import android.app.SearchManager; +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Paint; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.format.DateUtils; +import android.text.style.BackgroundColorSpan; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.WindowManager; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.CompoundButton.OnCheckedChangeListener; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.model.WorkingNote; +import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.tool.ResourceParser.TextAppearanceResources; +import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; +import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; +import net.micode.notes.widget.NoteWidgetProvider_2x; +import net.micode.notes.widget.NoteWidgetProvider_4x; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +public class NoteEditActivity extends Activity implements OnClickListener, + NoteSettingChangedListener, OnTextViewChangeListener { + private class HeadViewHolder { + public TextView tvModified; + + public ImageView ivAlertIcon; + + public TextView tvAlertDate; + + public ImageView ibSetBgColor; + } + + private static final Map sBgSelectorBtnsMap = new HashMap(); + static { + sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); + sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); + sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); + sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); + sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); + } + + private static final Map sBgSelectorSelectionMap = new HashMap(); + static { + sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); + sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); + sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); + sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); + sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); + } + + private static final Map sFontSizeBtnsMap = new HashMap(); + static { + sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); + sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); + sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); + sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); + } + + private static final Map sFontSelectorSelectionMap = new HashMap(); + static { + sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); + sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); + } + + private static final String TAG = "NoteEditActivity"; + + private HeadViewHolder mNoteHeaderHolder; + + private View mHeadViewPanel; + + private View mNoteBgColorSelector; + + private View mFontSizeSelector; + + private EditText mNoteEditor; + + private View mNoteEditorPanel; + + private WorkingNote mWorkingNote; + + private SharedPreferences mSharedPrefs; + private int mFontSizeId; + + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; + + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; + + public static final String TAG_CHECKED = String.valueOf('\u221A'); + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); + + private LinearLayout mEditTextList; + + private String mUserQuery; + private Pattern mPattern; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.setContentView(R.layout.note_edit); + + if (savedInstanceState == null && !initActivityState(getIntent())) { + finish(); + return; + } + initResources(); + } + + /** + * Current activity may be killed when the memory is low. Once it is killed, for another time + * user load this activity, we should restore the former state + */ + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); + if (!initActivityState(intent)) { + finish(); + return; + } + Log.d(TAG, "Restoring from killed activity"); + } + } + + private boolean initActivityState(Intent intent) { + /** + * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, + * then jump to the NotesListActivity + */ + mWorkingNote = null; + if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { + long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); + mUserQuery = ""; + + /** + * Starting from the searched result + */ + if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { + noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); + mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); + } + + if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { + Intent jump = new Intent(this, NotesListActivity.class); + startActivity(jump); + showToast(R.string.error_note_not_exist); + finish(); + return false; + } else { + mWorkingNote = WorkingNote.load(this, noteId); + if (mWorkingNote == null) { + Log.e(TAG, "load note failed with note id" + noteId); + finish(); + return false; + } + } + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { + // New note + long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); + int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, + Notes.TYPE_WIDGET_INVALIDE); + int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, + ResourceParser.getDefaultBgId(this)); + + // Parse call-record note + String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); + long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); + if (callDate != 0 && phoneNumber != null) { + if (TextUtils.isEmpty(phoneNumber)) { + Log.w(TAG, "The call record number is null"); + } + long noteId = 0; + if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), + phoneNumber, callDate)) > 0) { + mWorkingNote = WorkingNote.load(this, noteId); + if (mWorkingNote == null) { + Log.e(TAG, "load call note failed with note id" + noteId); + finish(); + return false; + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, + widgetType, bgResId); + mWorkingNote.convertToCallNote(phoneNumber, callDate); + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, + bgResId); + } + + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } else { + Log.e(TAG, "Intent not specified action, should not support"); + finish(); + return false; + } + mWorkingNote.setOnSettingStatusChangedListener(this); + return true; + } + + @Override + protected void onResume() { + super.onResume(); + initNoteScreen(); + } + + private void initNoteScreen() { + mNoteEditor.setTextAppearance(this, TextAppearanceResources + .getTexAppearanceResource(mFontSizeId)); + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + switchToListMode(mWorkingNote.getContent()); + } else { + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + mNoteEditor.setSelection(mNoteEditor.getText().length()); + } + for (Integer id : sBgSelectorSelectionMap.keySet()) { + findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); + } + mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + + mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, + mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME + | DateUtils.FORMAT_SHOW_YEAR)); + + /** + * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker + * is not ready + */ + showAlertHeader(); + } + + private void showAlertHeader() { + if (mWorkingNote.hasClockAlert()) { + long time = System.currentTimeMillis(); + if (time > mWorkingNote.getAlertDate()) { + mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); + } else { + mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( + mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); + } + mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); + mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); + } else { + mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); + mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); + }; + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + initActivityState(intent); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + /** + * For new note without note id, we should firstly save it to + * generate a id. If the editing note is not worth saving, there + * is no id which is equivalent to create new note + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); + Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (mNoteBgColorSelector.getVisibility() == View.VISIBLE + && !inRangeOfView(mNoteBgColorSelector, ev)) { + mNoteBgColorSelector.setVisibility(View.GONE); + return true; + } + + if (mFontSizeSelector.getVisibility() == View.VISIBLE + && !inRangeOfView(mFontSizeSelector, ev)) { + mFontSizeSelector.setVisibility(View.GONE); + return true; + } + return super.dispatchTouchEvent(ev); + } + + private boolean inRangeOfView(View view, MotionEvent ev) { + int []location = new int[2]; + view.getLocationOnScreen(location); + int x = location[0]; + int y = location[1]; + if (ev.getX() < x + || ev.getX() > (x + view.getWidth()) + || ev.getY() < y + || ev.getY() > (y + view.getHeight())) { + return false; + } + return true; + } + + private void initResources() { + mHeadViewPanel = findViewById(R.id.note_title); + mNoteHeaderHolder = new HeadViewHolder(); + mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); + mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon); + mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); + mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); + mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); + mNoteEditor = (EditText) findViewById(R.id.note_edit_view); + mNoteEditorPanel = findViewById(R.id.sv_note_edit); + mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); + for (int id : sBgSelectorBtnsMap.keySet()) { + ImageView iv = (ImageView) findViewById(id); + iv.setOnClickListener(this); + } + + mFontSizeSelector = findViewById(R.id.font_size_selector); + for (int id : sFontSizeBtnsMap.keySet()) { + View view = findViewById(id); + view.setOnClickListener(this); + }; + mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); + /** + * HACKME: Fix bug of store the resource id in shared preference. + * The id may larger than the length of resources, in this case, + * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + */ + if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { + mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; + } + mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); + } + + @Override + protected void onPause() { + super.onPause(); + if(saveNote()) { + Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); + } + clearSettingState(); + } + + private void updateWidget() { + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { + intent.setClass(this, NoteWidgetProvider_2x.class); + } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { + intent.setClass(this, NoteWidgetProvider_4x.class); + } else { + Log.e(TAG, "Unspported widget type"); + return; + } + + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { + mWorkingNote.getWidgetId() + }); + + sendBroadcast(intent); + setResult(RESULT_OK, intent); + } + + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.btn_set_bg_color) { + mNoteBgColorSelector.setVisibility(View.VISIBLE); + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + - View.VISIBLE); + } else if (sBgSelectorBtnsMap.containsKey(id)) { + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + View.GONE); + mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); + mNoteBgColorSelector.setVisibility(View.GONE); + } else if (sFontSizeBtnsMap.containsKey(id)) { + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); + mFontSizeId = sFontSizeBtnsMap.get(id); + mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + getWorkingText(); + switchToListMode(mWorkingNote.getContent()); + } else { + mNoteEditor.setTextAppearance(this, + TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); + } + mFontSizeSelector.setVisibility(View.GONE); + } + } + + @Override + public void onBackPressed() { + if(clearSettingState()) { + return; + } + + saveNote(); + super.onBackPressed(); + } + + private boolean clearSettingState() { + if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { + mNoteBgColorSelector.setVisibility(View.GONE); + return true; + } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { + mFontSizeSelector.setVisibility(View.GONE); + return true; + } + return false; + } + + public void onBackgroundColorChanged() { + findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( + View.VISIBLE); + mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + if (isFinishing()) { + return true; + } + clearSettingState(); + menu.clear(); + if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { + getMenuInflater().inflate(R.menu.call_note_edit, menu); + } else { + getMenuInflater().inflate(R.menu.note_edit, menu); + } + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); + } else { + menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); + } + if (mWorkingNote.hasClockAlert()) { + menu.findItem(R.id.menu_alert).setVisible(false); + } else { + menu.findItem(R.id.menu_delete_remind).setVisible(false); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_new_note: + createNewNote(); + break; + case R.id.menu_delete: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_note)); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteCurrentNote(); + finish(); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case R.id.menu_font_size: + mFontSizeSelector.setVisibility(View.VISIBLE); + findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); + break; + case R.id.menu_list_mode: + mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? + TextNote.MODE_CHECK_LIST : 0); + break; + case R.id.menu_share: + getWorkingText(); + sendTo(this, mWorkingNote.getContent()); + break; + case R.id.menu_send_to_desktop: + sendToDesktop(); + break; + case R.id.menu_alert: + setReminder(); + break; + case R.id.menu_delete_remind: + mWorkingNote.setAlertDate(0, false); + break; + default: + break; + } + return true; + } + + private void setReminder() { + DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); + d.setOnDateTimeSetListener(new OnDateTimeSetListener() { + public void OnDateTimeSet(AlertDialog dialog, long date) { + mWorkingNote.setAlertDate(date , true); + } + }); + d.show(); + } + + /** + * Share note to apps that support {@link Intent#ACTION_SEND} action + * and {@text/plain} type + */ + private void sendTo(Context context, String info) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.putExtra(Intent.EXTRA_TEXT, info); + intent.setType("text/plain"); + context.startActivity(intent); + } + + private void createNewNote() { + // Firstly, save current editing notes + saveNote(); + + // For safety, start a new NoteEditActivity + finish(); + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); + startActivity(intent); + } + + private void deleteCurrentNote() { + if (mWorkingNote.existInDatabase()) { + HashSet ids = new HashSet(); + long id = mWorkingNote.getNoteId(); + if (id != Notes.ID_ROOT_FOLDER) { + ids.add(id); + } else { + Log.d(TAG, "Wrong note id, should not happen"); + } + if (!isSyncMode()) { + if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { + Log.e(TAG, "Delete Note error"); + } + } else { + if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { + Log.e(TAG, "Move notes to trash folder error, should not happens"); + } + } + } + mWorkingNote.markDeleted(true); + } + + private boolean isSyncMode() { + return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; + } + + public void onClockAlertChanged(long date, boolean set) { + /** + * User could set clock to an unsaved note, so before setting the + * alert clock, we should save the note first + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + if (mWorkingNote.getNoteId() > 0) { + Intent intent = new Intent(this, AlarmReceiver.class); + intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); + PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); + AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); + showAlertHeader(); + if(!set) { + alarmManager.cancel(pendingIntent); + } else { + alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); + } + } else { + /** + * There is the condition that user has input nothing (the note is + * not worthy saving), we have no note id, remind the user that he + * should input something + */ + Log.e(TAG, "Clock alert setting error"); + showToast(R.string.error_note_empty_for_clock); + } + } + + public void onWidgetChanged() { + updateWidget(); + } + + public void onEditTextDelete(int index, String text) { + int childCount = mEditTextList.getChildCount(); + if (childCount == 1) { + return; + } + + for (int i = index + 1; i < childCount; i++) { + ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) + .setIndex(i - 1); + } + + mEditTextList.removeViewAt(index); + NoteEditText edit = null; + if(index == 0) { + edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( + R.id.et_edit_text); + } else { + edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( + R.id.et_edit_text); + } + int length = edit.length(); + edit.append(text); + edit.requestFocus(); + edit.setSelection(length); + } + + public void onEditTextEnter(int index, String text) { + /** + * Should not happen, check for debug + */ + if(index > mEditTextList.getChildCount()) { + Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); + } + + View view = getListItem(text, index); + mEditTextList.addView(view, index); + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + edit.requestFocus(); + edit.setSelection(0); + for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { + ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) + .setIndex(i); + } + } + + private void switchToListMode(String text) { + mEditTextList.removeAllViews(); + String[] items = text.split("\n"); + int index = 0; + for (String item : items) { + if(!TextUtils.isEmpty(item)) { + mEditTextList.addView(getListItem(item, index)); + index++; + } + } + mEditTextList.addView(getListItem("", index)); + mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); + + mNoteEditor.setVisibility(View.GONE); + mEditTextList.setVisibility(View.VISIBLE); + } + + private Spannable getHighlightQueryResult(String fullText, String userQuery) { + SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); + if (!TextUtils.isEmpty(userQuery)) { + mPattern = Pattern.compile(userQuery); + Matcher m = mPattern.matcher(fullText); + int start = 0; + while (m.find(start)) { + spannable.setSpan( + new BackgroundColorSpan(this.getResources().getColor( + R.color.user_query_highlight)), m.start(), m.end(), + Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + start = m.end(); + } + } + return spannable; + } + + private View getListItem(String item, int index) { + View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); + final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); + CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); + cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); + } + } + }); + + if (item.startsWith(TAG_CHECKED)) { + cb.setChecked(true); + edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + item = item.substring(TAG_CHECKED.length(), item.length()).trim(); + } else if (item.startsWith(TAG_UNCHECKED)) { + cb.setChecked(false); + edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); + item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); + } + + edit.setOnTextViewChangeListener(this); + edit.setIndex(index); + edit.setText(getHighlightQueryResult(item, mUserQuery)); + return view; + } + + public void onTextChange(int index, boolean hasText) { + if (index >= mEditTextList.getChildCount()) { + Log.e(TAG, "Wrong index, should not happen"); + return; + } + if(hasText) { + mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); + } else { + mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); + } + } + + public void onCheckListModeChanged(int oldMode, int newMode) { + if (newMode == TextNote.MODE_CHECK_LIST) { + switchToListMode(mNoteEditor.getText().toString()); + } else { + if (!getWorkingText()) { + mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", + "")); + } + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + mEditTextList.setVisibility(View.GONE); + mNoteEditor.setVisibility(View.VISIBLE); + } + } + + private boolean getWorkingText() { + boolean hasChecked = false; + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < mEditTextList.getChildCount(); i++) { + View view = mEditTextList.getChildAt(i); + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + if (!TextUtils.isEmpty(edit.getText())) { + if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { + sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); + hasChecked = true; + } else { + sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); + } + } + } + mWorkingNote.setWorkingText(sb.toString()); + } else { + mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); + } + return hasChecked; + } + + private boolean saveNote() { + getWorkingText(); + boolean saved = mWorkingNote.saveNote(); + if (saved) { + /** + * There are two modes from List view to edit view, open one note, + * create/edit a node. Opening node requires to the original + * position in the list when back from edit view, while creating a + * new node requires to the top of the list. This code + * {@link #RESULT_OK} is used to identify the create/edit state + */ + setResult(RESULT_OK); + } + return saved; + } + + private void sendToDesktop() { + /** + * Before send message to home, we should make sure that current + * editing note is exists in databases. So, for new note, firstly + * save it + */ + if (!mWorkingNote.existInDatabase()) { + saveNote(); + } + + if (mWorkingNote.getNoteId() > 0) { + Intent sender = new Intent(); + Intent shortcutIntent = new Intent(this, NoteEditActivity.class); + shortcutIntent.setAction(Intent.ACTION_VIEW); + shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); + sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); + sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, + makeShortcutIconTitle(mWorkingNote.getContent())); + sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, + Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); + sender.putExtra("duplicate", true); + sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); + showToast(R.string.info_note_enter_desktop); + sendBroadcast(sender); + } else { + /** + * There is the condition that user has input nothing (the note is + * not worthy saving), we have no note id, remind the user that he + * should input something + */ + Log.e(TAG, "Send to desktop error"); + showToast(R.string.error_note_empty_for_send_to_desktop); + } + } + + private String makeShortcutIconTitle(String content) { + content = content.replace(TAG_CHECKED, ""); + content = content.replace(TAG_UNCHECKED, ""); + return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, + SHORTCUT_ICON_TITLE_MAX_LEN) : content; + } + + private void showToast(int resId) { + showToast(resId, Toast.LENGTH_SHORT); + } + + private void showToast(int resId, int duration) { + Toast.makeText(this, resId, duration).show(); + } +} diff --git a/src/notes/ui/NoteEditText.java b/src/notes/ui/NoteEditText.java new file mode 100644 index 0000000..2afe2a8 --- /dev/null +++ b/src/notes/ui/NoteEditText.java @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.graphics.Rect; +import android.text.Layout; +import android.text.Selection; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.URLSpan; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.MotionEvent; +import android.widget.EditText; + +import net.micode.notes.R; + +import java.util.HashMap; +import java.util.Map; + +public class NoteEditText extends EditText { + private static final String TAG = "NoteEditText"; + private int mIndex; + private int mSelectionStartBeforeDelete; + + private static final String SCHEME_TEL = "tel:" ; + private static final String SCHEME_HTTP = "http:" ; + private static final String SCHEME_EMAIL = "mailto:" ; + + private static final Map sSchemaActionResMap = new HashMap(); + static { + sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); + sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); + sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); + } + + /** + * Call by the {@link NoteEditActivity} to delete or add edit text + */ + public interface OnTextViewChangeListener { + /** + * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens + * and the text is null + */ + void onEditTextDelete(int index, String text); + + /** + * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} + * happen + */ + void onEditTextEnter(int index, String text); + + /** + * Hide or show item option when text change + */ + void onTextChange(int index, boolean hasText); + } + + private OnTextViewChangeListener mOnTextViewChangeListener; + + public NoteEditText(Context context) { + super(context, null); + mIndex = 0; + } + + public void setIndex(int index) { + mIndex = index; + } + + public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { + mOnTextViewChangeListener = listener; + } + + public NoteEditText(Context context, AttributeSet attrs) { + super(context, attrs, android.R.attr.editTextStyle); + } + + public NoteEditText(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + // TODO Auto-generated constructor stub + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + + int x = (int) event.getX(); + int y = (int) event.getY(); + x -= getTotalPaddingLeft(); + y -= getTotalPaddingTop(); + x += getScrollX(); + y += getScrollY(); + + Layout layout = getLayout(); + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + Selection.setSelection(getText(), off); + break; + } + + return super.onTouchEvent(event); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + switch (keyCode) { + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + return false; + } + break; + case KeyEvent.KEYCODE_DEL: + mSelectionStartBeforeDelete = getSelectionStart(); + break; + default: + break; + } + return super.onKeyDown(keyCode, event); + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + switch(keyCode) { + case KeyEvent.KEYCODE_DEL: + if (mOnTextViewChangeListener != null) { + if (0 == mSelectionStartBeforeDelete && mIndex != 0) { + mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); + return true; + } + } else { + Log.d(TAG, "OnTextViewChangeListener was not seted"); + } + break; + case KeyEvent.KEYCODE_ENTER: + if (mOnTextViewChangeListener != null) { + int selectionStart = getSelectionStart(); + String text = getText().subSequence(selectionStart, length()).toString(); + setText(getText().subSequence(0, selectionStart)); + mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); + } else { + Log.d(TAG, "OnTextViewChangeListener was not seted"); + } + break; + default: + break; + } + return super.onKeyUp(keyCode, event); + } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + if (mOnTextViewChangeListener != null) { + if (!focused && TextUtils.isEmpty(getText())) { + mOnTextViewChangeListener.onTextChange(mIndex, false); + } else { + mOnTextViewChangeListener.onTextChange(mIndex, true); + } + } + super.onFocusChanged(focused, direction, previouslyFocusedRect); + } + + @Override + protected void onCreateContextMenu(ContextMenu menu) { + if (getText() instanceof Spanned) { + int selStart = getSelectionStart(); + int selEnd = getSelectionEnd(); + + int min = Math.min(selStart, selEnd); + int max = Math.max(selStart, selEnd); + + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + if (urls.length == 1) { + int defaultResId = 0; + for(String schema: sSchemaActionResMap.keySet()) { + if(urls[0].getURL().indexOf(schema) >= 0) { + defaultResId = sSchemaActionResMap.get(schema); + break; + } + } + + if (defaultResId == 0) { + defaultResId = R.string.note_link_other; + } + + menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( + new OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + // goto a new intent + urls[0].onClick(NoteEditText.this); + return true; + } + }); + } + } + super.onCreateContextMenu(menu); + } +} diff --git a/src/notes/ui/NoteItemData.java b/src/notes/ui/NoteItemData.java new file mode 100644 index 0000000..0f5a878 --- /dev/null +++ b/src/notes/ui/NoteItemData.java @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; + +import net.micode.notes.data.Contact; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.DataUtils; + + +public class NoteItemData { + static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, + NoteColumns.HAS_ATTACHMENT, + NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, + NoteColumns.PARENT_ID, + NoteColumns.SNIPPET, + NoteColumns.TYPE, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + }; + + private static final int ID_COLUMN = 0; + private static final int ALERTED_DATE_COLUMN = 1; + private static final int BG_COLOR_ID_COLUMN = 2; + private static final int CREATED_DATE_COLUMN = 3; + private static final int HAS_ATTACHMENT_COLUMN = 4; + private static final int MODIFIED_DATE_COLUMN = 5; + private static final int NOTES_COUNT_COLUMN = 6; + private static final int PARENT_ID_COLUMN = 7; + private static final int SNIPPET_COLUMN = 8; + private static final int TYPE_COLUMN = 9; + private static final int WIDGET_ID_COLUMN = 10; + private static final int WIDGET_TYPE_COLUMN = 11; + + private long mId; + private long mAlertDate; + private int mBgColorId; + private long mCreatedDate; + private boolean mHasAttachment; + private long mModifiedDate; + private int mNotesCount; + private long mParentId; + private String mSnippet; + private int mType; + private int mWidgetId; + private int mWidgetType; + private String mName; + private String mPhoneNumber; + + private boolean mIsLastItem; + private boolean mIsFirstItem; + private boolean mIsOnlyOneItem; + private boolean mIsOneNoteFollowingFolder; + private boolean mIsMultiNotesFollowingFolder; + + public NoteItemData(Context context, Cursor cursor) { + mId = cursor.getLong(ID_COLUMN); + mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); + mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; + mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); + mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); + mParentId = cursor.getLong(PARENT_ID_COLUMN); + mSnippet = cursor.getString(SNIPPET_COLUMN); + mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( + NoteEditActivity.TAG_UNCHECKED, ""); + mType = cursor.getInt(TYPE_COLUMN); + mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); + + mPhoneNumber = ""; + if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { + mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); + if (!TextUtils.isEmpty(mPhoneNumber)) { + mName = Contact.getContact(context, mPhoneNumber); + if (mName == null) { + mName = mPhoneNumber; + } + } + } + + if (mName == null) { + mName = ""; + } + checkPostion(cursor); + } + + private void checkPostion(Cursor cursor) { + mIsLastItem = cursor.isLast() ? true : false; + mIsFirstItem = cursor.isFirst() ? true : false; + mIsOnlyOneItem = (cursor.getCount() == 1); + mIsMultiNotesFollowingFolder = false; + mIsOneNoteFollowingFolder = false; + + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { + int position = cursor.getPosition(); + if (cursor.moveToPrevious()) { + if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER + || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { + if (cursor.getCount() > (position + 1)) { + mIsMultiNotesFollowingFolder = true; + } else { + mIsOneNoteFollowingFolder = true; + } + } + if (!cursor.moveToNext()) { + throw new IllegalStateException("cursor move to previous but can't move back"); + } + } + } + } + + public boolean isOneFollowingFolder() { + return mIsOneNoteFollowingFolder; + } + + public boolean isMultiFollowingFolder() { + return mIsMultiNotesFollowingFolder; + } + + public boolean isLast() { + return mIsLastItem; + } + + public String getCallName() { + return mName; + } + + public boolean isFirst() { + return mIsFirstItem; + } + + public boolean isSingle() { + return mIsOnlyOneItem; + } + + public long getId() { + return mId; + } + + public long getAlertDate() { + return mAlertDate; + } + + public long getCreatedDate() { + return mCreatedDate; + } + + public boolean hasAttachment() { + return mHasAttachment; + } + + public long getModifiedDate() { + return mModifiedDate; + } + + public int getBgColorId() { + return mBgColorId; + } + + public long getParentId() { + return mParentId; + } + + public int getNotesCount() { + return mNotesCount; + } + + public long getFolderId () { + return mParentId; + } + + public int getType() { + return mType; + } + + public int getWidgetType() { + return mWidgetType; + } + + public int getWidgetId() { + return mWidgetId; + } + + public String getSnippet() { + return mSnippet; + } + + public boolean hasAlert() { + return (mAlertDate > 0); + } + + public boolean isCallRecord() { + return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); + } + + public static int getNoteType(Cursor cursor) { + return cursor.getInt(TYPE_COLUMN); + } +} diff --git a/src/notes/ui/NotesListActivity.java b/src/notes/ui/NotesListActivity.java new file mode 100644 index 0000000..e843aec --- /dev/null +++ b/src/notes/ui/NotesListActivity.java @@ -0,0 +1,954 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.appwidget.AppWidgetManager; +import android.content.AsyncQueryHandler; +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.database.Cursor; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Display; +import android.view.HapticFeedbackConstants; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.View.OnCreateContextMenuListener; +import android.view.View.OnTouchListener; +import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.PopupMenu; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.remote.GTaskSyncService; +import net.micode.notes.model.WorkingNote; +import net.micode.notes.tool.BackupUtils; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; +import net.micode.notes.widget.NoteWidgetProvider_2x; +import net.micode.notes.widget.NoteWidgetProvider_4x; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashSet; + +public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { + private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; + + private static final int FOLDER_LIST_QUERY_TOKEN = 1; + + private static final int MENU_FOLDER_DELETE = 0; + + private static final int MENU_FOLDER_VIEW = 1; + + private static final int MENU_FOLDER_CHANGE_NAME = 2; + + private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; + + private enum ListEditState { + NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER + }; + + private ListEditState mState; + + private BackgroundQueryHandler mBackgroundQueryHandler; + + private NotesListAdapter mNotesListAdapter; + + private ListView mNotesListView; + + private Button mAddNewNote; + + private boolean mDispatch; + + private int mOriginY; + + private int mDispatchY; + + private TextView mTitleBar; + + private long mCurrentFolderId; + + private ContentResolver mContentResolver; + + private ModeCallback mModeCallBack; + + private static final String TAG = "NotesListActivity"; + + public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; + + private NoteItemData mFocusNoteDataItem; + + private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; + + private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" + + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " + + NoteColumns.NOTES_COUNT + ">0)"; + + private final static int REQUEST_CODE_OPEN_NODE = 102; + private final static int REQUEST_CODE_NEW_NODE = 103; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.note_list); + initResources(); + + /** + * Insert an introduction when user firstly use this application + */ + setAppInfoFromRawRes(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode == RESULT_OK + && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { + mNotesListAdapter.changeCursor(null); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + private void setAppInfoFromRawRes() { + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); + if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { + StringBuilder sb = new StringBuilder(); + InputStream in = null; + try { + in = getResources().openRawResource(R.raw.introduction); + if (in != null) { + InputStreamReader isr = new InputStreamReader(in); + BufferedReader br = new BufferedReader(isr); + char [] buf = new char[1024]; + int len = 0; + while ((len = br.read(buf)) > 0) { + sb.append(buf, 0, len); + } + } else { + Log.e(TAG, "Read introduction file error"); + return; + } + } catch (IOException e) { + e.printStackTrace(); + return; + } finally { + if(in != null) { + try { + in.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, + AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, + ResourceParser.RED); + note.setWorkingText(sb.toString()); + if (note.saveNote()) { + sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); + } else { + Log.e(TAG, "Save introduction note error"); + return; + } + } + } + + @Override + protected void onStart() { + super.onStart(); + startAsyncNotesListQuery(); + } + + private void initResources() { + mContentResolver = this.getContentResolver(); + mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mNotesListView = (ListView) findViewById(R.id.notes_list); + mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), + null, false); + mNotesListView.setOnItemClickListener(new OnListItemClickListener()); + mNotesListView.setOnItemLongClickListener(this); + mNotesListAdapter = new NotesListAdapter(this); + mNotesListView.setAdapter(mNotesListAdapter); + mAddNewNote = (Button) findViewById(R.id.btn_new_note); + mAddNewNote.setOnClickListener(this); + mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); + mDispatch = false; + mDispatchY = 0; + mOriginY = 0; + mTitleBar = (TextView) findViewById(R.id.tv_title_bar); + mState = ListEditState.NOTE_LIST; + mModeCallBack = new ModeCallback(); + } + + private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { + private DropdownMenu mDropDownMenu; + private ActionMode mActionMode; + private MenuItem mMoveMenu; + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + getMenuInflater().inflate(R.menu.note_list_options, menu); + menu.findItem(R.id.delete).setOnMenuItemClickListener(this); + mMoveMenu = menu.findItem(R.id.move); + if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER + || DataUtils.getUserFolderCount(mContentResolver) == 0) { + mMoveMenu.setVisible(false); + } else { + mMoveMenu.setVisible(true); + mMoveMenu.setOnMenuItemClickListener(this); + } + mActionMode = mode; + mNotesListAdapter.setChoiceMode(true); + mNotesListView.setLongClickable(false); + mAddNewNote.setVisibility(View.GONE); + + View customView = LayoutInflater.from(NotesListActivity.this).inflate( + R.layout.note_list_dropdown_menu, null); + mode.setCustomView(customView); + mDropDownMenu = new DropdownMenu(NotesListActivity.this, + (Button) customView.findViewById(R.id.selection_menu), + R.menu.note_list_dropdown); + mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ + public boolean onMenuItemClick(MenuItem item) { + mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); + updateMenu(); + return true; + } + + }); + return true; + } + + private void updateMenu() { + int selectedCount = mNotesListAdapter.getSelectedCount(); + // Update dropdown menu + String format = getResources().getString(R.string.menu_select_title, selectedCount); + mDropDownMenu.setTitle(format); + MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); + if (item != null) { + if (mNotesListAdapter.isAllSelected()) { + item.setChecked(true); + item.setTitle(R.string.menu_deselect_all); + } else { + item.setChecked(false); + item.setTitle(R.string.menu_select_all); + } + } + } + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + // TODO Auto-generated method stub + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + // TODO Auto-generated method stub + return false; + } + + public void onDestroyActionMode(ActionMode mode) { + mNotesListAdapter.setChoiceMode(false); + mNotesListView.setLongClickable(true); + mAddNewNote.setVisibility(View.VISIBLE); + } + + public void finishActionMode() { + mActionMode.finish(); + } + + public void onItemCheckedStateChanged(ActionMode mode, int position, long id, + boolean checked) { + mNotesListAdapter.setCheckedItem(position, checked); + updateMenu(); + } + + public boolean onMenuItemClick(MenuItem item) { + if (mNotesListAdapter.getSelectedCount() == 0) { + Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), + Toast.LENGTH_SHORT).show(); + return true; + } + + switch (item.getItemId()) { + case R.id.delete: + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_notes, + mNotesListAdapter.getSelectedCount())); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, + int which) { + batchDelete(); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case R.id.move: + startQueryDestinationFolders(); + break; + default: + return false; + } + return true; + } + } + + private class NewNoteOnTouchListener implements OnTouchListener { + + public boolean onTouch(View v, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: { + Display display = getWindowManager().getDefaultDisplay(); + int screenHeight = display.getHeight(); + int newNoteViewHeight = mAddNewNote.getHeight(); + int start = screenHeight - newNoteViewHeight; + int eventY = start + (int) event.getY(); + /** + * Minus TitleBar's height + */ + if (mState == ListEditState.SUB_FOLDER) { + eventY -= mTitleBar.getHeight(); + start -= mTitleBar.getHeight(); + } + /** + * HACKME:When click the transparent part of "New Note" button, dispatch + * the event to the list view behind this button. The transparent part of + * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel) + * and the line top of the button. The coordinate based on left of the "New + * Note" button. The 94 represents maximum height of the transparent part. + * Notice that, if the background of the button changes, the formula should + * also change. This is very bad, just for the UI designer's strong requirement. + */ + if (event.getY() < (event.getX() * (-0.12) + 94)) { + View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 + - mNotesListView.getFooterViewsCount()); + if (view != null && view.getBottom() > start + && (view.getTop() < (start + 94))) { + mOriginY = (int) event.getY(); + mDispatchY = eventY; + event.setLocation(event.getX(), mDispatchY); + mDispatch = true; + return mNotesListView.dispatchTouchEvent(event); + } + } + break; + } + case MotionEvent.ACTION_MOVE: { + if (mDispatch) { + mDispatchY += (int) event.getY() - mOriginY; + event.setLocation(event.getX(), mDispatchY); + return mNotesListView.dispatchTouchEvent(event); + } + break; + } + default: { + if (mDispatch) { + event.setLocation(event.getX(), mDispatchY); + mDispatch = false; + return mNotesListView.dispatchTouchEvent(event); + } + break; + } + } + return false; + } + + }; + + private void startAsyncNotesListQuery() { + String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION + : NORMAL_SELECTION; + mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, + Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + } + + private final class BackgroundQueryHandler extends AsyncQueryHandler { + public BackgroundQueryHandler(ContentResolver contentResolver) { + super(contentResolver); + } + + @Override + protected void onQueryComplete(int token, Object cookie, Cursor cursor) { + switch (token) { + case FOLDER_NOTE_LIST_QUERY_TOKEN: + mNotesListAdapter.changeCursor(cursor); + break; + case FOLDER_LIST_QUERY_TOKEN: + if (cursor != null && cursor.getCount() > 0) { + showFolderListMenu(cursor); + } else { + Log.e(TAG, "Query folder failed"); + } + break; + default: + return; + } + } + } + + private void showFolderListMenu(Cursor cursor) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(R.string.menu_title_select_folder); + final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); + builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + + public void onClick(DialogInterface dialog, int which) { + DataUtils.batchMoveToFolder(mContentResolver, + mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); + Toast.makeText( + NotesListActivity.this, + getString(R.string.format_move_notes_to_folder, + mNotesListAdapter.getSelectedCount(), + adapter.getFolderName(NotesListActivity.this, which)), + Toast.LENGTH_SHORT).show(); + mModeCallBack.finishActionMode(); + } + }); + builder.show(); + } + + private void createNewNote() { + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); + this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); + } + + private void batchDelete() { + new AsyncTask>() { + protected HashSet doInBackground(Void... unused) { + HashSet widgets = mNotesListAdapter.getSelectedWidget(); + if (!isSyncMode()) { + // if not synced, delete notes directly + if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter + .getSelectedItemIds())) { + } else { + Log.e(TAG, "Delete notes error, should not happens"); + } + } else { + // in sync mode, we'll move the deleted note into the trash + // folder + if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter + .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { + Log.e(TAG, "Move notes to trash folder error, should not happens"); + } + } + return widgets; + } + + @Override + protected void onPostExecute(HashSet widgets) { + if (widgets != null) { + for (AppWidgetAttribute widget : widgets) { + if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { + updateWidget(widget.widgetId, widget.widgetType); + } + } + } + mModeCallBack.finishActionMode(); + } + }.execute(); + } + + private void deleteFolder(long folderId) { + if (folderId == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Wrong folder id, should not happen " + folderId); + return; + } + + HashSet ids = new HashSet(); + ids.add(folderId); + HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, + folderId); + if (!isSyncMode()) { + // if not synced, delete folder directly + DataUtils.batchDeleteNotes(mContentResolver, ids); + } else { + // in sync mode, we'll move the deleted folder into the trash folder + DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER); + } + if (widgets != null) { + for (AppWidgetAttribute widget : widgets) { + if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { + updateWidget(widget.widgetId, widget.widgetType); + } + } + } + } + + private void openNode(NoteItemData data) { + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, data.getId()); + this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); + } + + private void openFolder(NoteItemData data) { + mCurrentFolderId = data.getId(); + startAsyncNotesListQuery(); + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mState = ListEditState.CALL_RECORD_FOLDER; + mAddNewNote.setVisibility(View.GONE); + } else { + mState = ListEditState.SUB_FOLDER; + } + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mTitleBar.setText(R.string.call_record_folder_name); + } else { + mTitleBar.setText(data.getSnippet()); + } + mTitleBar.setVisibility(View.VISIBLE); + } + + public void onClick(View v) { + switch (v.getId()) { + case R.id.btn_new_note: + createNewNote(); + break; + default: + break; + } + } + + private void showSoftInput() { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if (inputMethodManager != null) { + inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + } + } + + private void hideSoftInput(View view) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + + private void showCreateOrModifyFolderDialog(final boolean create) { + final AlertDialog.Builder builder = new AlertDialog.Builder(this); + View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); + final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); + showSoftInput(); + if (!create) { + if (mFocusNoteDataItem != null) { + etName.setText(mFocusNoteDataItem.getSnippet()); + builder.setTitle(getString(R.string.menu_folder_change_name)); + } else { + Log.e(TAG, "The long click data item is null"); + return; + } + } else { + etName.setText(""); + builder.setTitle(this.getString(R.string.menu_create_folder)); + } + + builder.setPositiveButton(android.R.string.ok, null); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + hideSoftInput(etName); + } + }); + + final Dialog dialog = builder.setView(view).show(); + final Button positive = (Button)dialog.findViewById(android.R.id.button1); + positive.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + hideSoftInput(etName); + String name = etName.getText().toString(); + if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { + Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), + Toast.LENGTH_LONG).show(); + etName.setSelection(0, etName.length()); + return; + } + if (!create) { + if (!TextUtils.isEmpty(name)) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.SNIPPET, name); + values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID + + "=?", new String[] { + String.valueOf(mFocusNoteDataItem.getId()) + }); + } + } else if (!TextUtils.isEmpty(name)) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.SNIPPET, name); + values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); + } + dialog.dismiss(); + } + }); + + if (TextUtils.isEmpty(etName.getText())) { + positive.setEnabled(false); + } + /** + * When the name edit text is null, disable the positive button + */ + etName.addTextChangedListener(new TextWatcher() { + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // TODO Auto-generated method stub + + } + + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (TextUtils.isEmpty(etName.getText())) { + positive.setEnabled(false); + } else { + positive.setEnabled(true); + } + } + + public void afterTextChanged(Editable s) { + // TODO Auto-generated method stub + + } + }); + } + + @Override + public void onBackPressed() { + switch (mState) { + case SUB_FOLDER: + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + startAsyncNotesListQuery(); + mTitleBar.setVisibility(View.GONE); + break; + case CALL_RECORD_FOLDER: + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + mAddNewNote.setVisibility(View.VISIBLE); + mTitleBar.setVisibility(View.GONE); + startAsyncNotesListQuery(); + break; + case NOTE_LIST: + super.onBackPressed(); + break; + default: + break; + } + } + + private void updateWidget(int appWidgetId, int appWidgetType) { + Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + if (appWidgetType == Notes.TYPE_WIDGET_2X) { + intent.setClass(this, NoteWidgetProvider_2x.class); + } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { + intent.setClass(this, NoteWidgetProvider_4x.class); + } else { + Log.e(TAG, "Unspported widget type"); + return; + } + + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { + appWidgetId + }); + + sendBroadcast(intent); + setResult(RESULT_OK, intent); + } + + private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { + if (mFocusNoteDataItem != null) { + menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); + menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view); + menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete); + menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name); + } + } + }; + + @Override + public void onContextMenuClosed(Menu menu) { + if (mNotesListView != null) { + mNotesListView.setOnCreateContextMenuListener(null); + } + super.onContextMenuClosed(menu); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + if (mFocusNoteDataItem == null) { + Log.e(TAG, "The long click data item is null"); + return false; + } + switch (item.getItemId()) { + case MENU_FOLDER_VIEW: + openFolder(mFocusNoteDataItem); + break; + case MENU_FOLDER_DELETE: + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.alert_title_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert); + builder.setMessage(getString(R.string.alert_message_delete_folder)); + builder.setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + deleteFolder(mFocusNoteDataItem.getId()); + } + }); + builder.setNegativeButton(android.R.string.cancel, null); + builder.show(); + break; + case MENU_FOLDER_CHANGE_NAME: + showCreateOrModifyFolderDialog(false); + break; + default: + break; + } + + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + menu.clear(); + if (mState == ListEditState.NOTE_LIST) { + getMenuInflater().inflate(R.menu.note_list, menu); + // set sync or sync_cancel + menu.findItem(R.id.menu_sync).setTitle( + GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync); + } else if (mState == ListEditState.SUB_FOLDER) { + getMenuInflater().inflate(R.menu.sub_folder, menu); + } else if (mState == ListEditState.CALL_RECORD_FOLDER) { + getMenuInflater().inflate(R.menu.call_record_folder, menu); + } else { + Log.e(TAG, "Wrong state:" + mState); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_new_folder: { + showCreateOrModifyFolderDialog(true); + break; + } + case R.id.menu_export_text: { + exportNoteToText(); + break; + } + case R.id.menu_sync: { + if (isSyncMode()) { + if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { + GTaskSyncService.startSync(this); + } else { + GTaskSyncService.cancelSync(this); + } + } else { + startPreferenceActivity(); + } + break; + } + case R.id.menu_setting: { + startPreferenceActivity(); + break; + } + case R.id.menu_new_note: { + createNewNote(); + break; + } + case R.id.menu_search: + onSearchRequested(); + break; + default: + break; + } + return true; + } + + @Override + public boolean onSearchRequested() { + startSearch(null, false, null /* appData */, false); + return true; + } + + private void exportNoteToText() { + final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); + new AsyncTask() { + + @Override + protected Integer doInBackground(Void... unused) { + return backup.exportToText(); + } + + @Override + protected void onPostExecute(Integer result) { + if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.failed_sdcard_export)); + builder.setMessage(NotesListActivity.this + .getString(R.string.error_sdcard_unmounted)); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } else if (result == BackupUtils.STATE_SUCCESS) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.success_sdcard_export)); + builder.setMessage(NotesListActivity.this.getString( + R.string.format_exported_file_location, backup + .getExportedTextFileName(), backup.getExportedTextFileDir())); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } else if (result == BackupUtils.STATE_SYSTEM_ERROR) { + AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); + builder.setTitle(NotesListActivity.this + .getString(R.string.failed_sdcard_export)); + builder.setMessage(NotesListActivity.this + .getString(R.string.error_sdcard_export)); + builder.setPositiveButton(android.R.string.ok, null); + builder.show(); + } + } + + }.execute(); + } + + private boolean isSyncMode() { + return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; + } + + private void startPreferenceActivity() { + Activity from = getParent() != null ? getParent() : this; + Intent intent = new Intent(from, NotesPreferenceActivity.class); + from.startActivityIfNeeded(intent, -1); + } + + private class OnListItemClickListener implements OnItemClickListener { + + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + NoteItemData item = ((NotesListItem) view).getItemData(); + if (mNotesListAdapter.isInChoiceMode()) { + if (item.getType() == Notes.TYPE_NOTE) { + position = position - mNotesListView.getHeaderViewsCount(); + mModeCallBack.onItemCheckedStateChanged(null, position, id, + !mNotesListAdapter.isSelectedItem(position)); + } + return; + } + + switch (mState) { + case NOTE_LIST: + if (item.getType() == Notes.TYPE_FOLDER + || item.getType() == Notes.TYPE_SYSTEM) { + openFolder(item); + } else if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in NOTE_LIST"); + } + break; + case SUB_FOLDER: + case CALL_RECORD_FOLDER: + if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in SUB_FOLDER"); + } + break; + default: + break; + } + } + } + + } + + private void startQueryDestinationFolders() { + String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; + selection = (mState == ListEditState.NOTE_LIST) ? selection: + "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; + + mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, + null, + Notes.CONTENT_NOTE_URI, + FoldersListAdapter.PROJECTION, + selection, + new String[] { + String.valueOf(Notes.TYPE_FOLDER), + String.valueOf(Notes.ID_TRASH_FOLER), + String.valueOf(mCurrentFolderId) + }, + NoteColumns.MODIFIED_DATE + " DESC"); + } + + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (view instanceof NotesListItem) { + mFocusNoteDataItem = ((NotesListItem) view).getItemData(); + if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { + if (mNotesListView.startActionMode(mModeCallBack) != null) { + mModeCallBack.onItemCheckedStateChanged(null, position, id, true); + mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + } else { + Log.e(TAG, "startActionMode fails"); + } + } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { + mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); + } + } + return false; + } +} diff --git a/src/notes/ui/NotesListAdapter.java b/src/notes/ui/NotesListAdapter.java new file mode 100644 index 0000000..51c9cb9 --- /dev/null +++ b/src/notes/ui/NotesListAdapter.java @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.database.Cursor; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; + +import net.micode.notes.data.Notes; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; + + +public class NotesListAdapter extends CursorAdapter { + private static final String TAG = "NotesListAdapter"; + private Context mContext; + private HashMap mSelectedIndex; + private int mNotesCount; + private boolean mChoiceMode; + + public static class AppWidgetAttribute { + public int widgetId; + public int widgetType; + }; + + public NotesListAdapter(Context context) { + super(context, null); + mSelectedIndex = new HashMap(); + mContext = context; + mNotesCount = 0; + } + + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return new NotesListItem(context); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + if (view instanceof NotesListItem) { + NoteItemData itemData = new NoteItemData(context, cursor); + ((NotesListItem) view).bind(context, itemData, mChoiceMode, + isSelectedItem(cursor.getPosition())); + } + } + + public void setCheckedItem(final int position, final boolean checked) { + mSelectedIndex.put(position, checked); + notifyDataSetChanged(); + } + + public boolean isInChoiceMode() { + return mChoiceMode; + } + + public void setChoiceMode(boolean mode) { + mSelectedIndex.clear(); + mChoiceMode = mode; + } + + public void selectAll(boolean checked) { + Cursor cursor = getCursor(); + for (int i = 0; i < getCount(); i++) { + if (cursor.moveToPosition(i)) { + if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { + setCheckedItem(i, checked); + } + } + } + } + + public HashSet getSelectedItemIds() { + HashSet itemSet = new HashSet(); + for (Integer position : mSelectedIndex.keySet()) { + if (mSelectedIndex.get(position) == true) { + Long id = getItemId(position); + if (id == Notes.ID_ROOT_FOLDER) { + Log.d(TAG, "Wrong item id, should not happen"); + } else { + itemSet.add(id); + } + } + } + + return itemSet; + } + + public HashSet getSelectedWidget() { + HashSet itemSet = new HashSet(); + for (Integer position : mSelectedIndex.keySet()) { + if (mSelectedIndex.get(position) == true) { + Cursor c = (Cursor) getItem(position); + if (c != null) { + AppWidgetAttribute widget = new AppWidgetAttribute(); + NoteItemData item = new NoteItemData(mContext, c); + widget.widgetId = item.getWidgetId(); + widget.widgetType = item.getWidgetType(); + itemSet.add(widget); + /** + * Don't close cursor here, only the adapter could close it + */ + } else { + Log.e(TAG, "Invalid cursor"); + return null; + } + } + } + return itemSet; + } + + public int getSelectedCount() { + Collection values = mSelectedIndex.values(); + if (null == values) { + return 0; + } + Iterator iter = values.iterator(); + int count = 0; + while (iter.hasNext()) { + if (true == iter.next()) { + count++; + } + } + return count; + } + + public boolean isAllSelected() { + int checkedCount = getSelectedCount(); + return (checkedCount != 0 && checkedCount == mNotesCount); + } + + public boolean isSelectedItem(final int position) { + if (null == mSelectedIndex.get(position)) { + return false; + } + return mSelectedIndex.get(position); + } + + @Override + protected void onContentChanged() { + super.onContentChanged(); + calcNotesCount(); + } + + @Override + public void changeCursor(Cursor cursor) { + super.changeCursor(cursor); + calcNotesCount(); + } + + private void calcNotesCount() { + mNotesCount = 0; + for (int i = 0; i < getCount(); i++) { + Cursor c = (Cursor) getItem(i); + if (c != null) { + if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { + mNotesCount++; + } + } else { + Log.e(TAG, "Invalid cursor"); + return; + } + } + } +} diff --git a/src/notes/ui/NotesListItem.java b/src/notes/ui/NotesListItem.java new file mode 100644 index 0000000..1221e80 --- /dev/null +++ b/src/notes/ui/NotesListItem.java @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.text.format.DateUtils; +import android.view.View; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.DataUtils; +import net.micode.notes.tool.ResourceParser.NoteItemBgResources; + + +public class NotesListItem extends LinearLayout { + private ImageView mAlert; + private TextView mTitle; + private TextView mTime; + private TextView mCallName; + private NoteItemData mItemData; + private CheckBox mCheckBox; + + public NotesListItem(Context context) { + super(context); + inflate(context, R.layout.note_item, this); + mAlert = (ImageView) findViewById(R.id.iv_alert_icon); + mTitle = (TextView) findViewById(R.id.tv_title); + mTime = (TextView) findViewById(R.id.tv_time); + mCallName = (TextView) findViewById(R.id.tv_name); + mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); + } + + public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { + if (choiceMode && data.getType() == Notes.TYPE_NOTE) { + mCheckBox.setVisibility(View.VISIBLE); + mCheckBox.setChecked(checked); + } else { + mCheckBox.setVisibility(View.GONE); + } + + mItemData = data; + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + mCallName.setVisibility(View.GONE); + mAlert.setVisibility(View.VISIBLE); + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + mTitle.setText(context.getString(R.string.call_record_folder_name) + + context.getString(R.string.format_folder_files_count, data.getNotesCount())); + mAlert.setImageResource(R.drawable.call_record); + } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { + mCallName.setVisibility(View.VISIBLE); + mCallName.setText(data.getCallName()); + mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + if (data.hasAlert()) { + mAlert.setImageResource(R.drawable.clock); + mAlert.setVisibility(View.VISIBLE); + } else { + mAlert.setVisibility(View.GONE); + } + } else { + mCallName.setVisibility(View.GONE); + mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + + if (data.getType() == Notes.TYPE_FOLDER) { + mTitle.setText(data.getSnippet() + + context.getString(R.string.format_folder_files_count, + data.getNotesCount())); + mAlert.setVisibility(View.GONE); + } else { + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + if (data.hasAlert()) { + mAlert.setImageResource(R.drawable.clock); + mAlert.setVisibility(View.VISIBLE); + } else { + mAlert.setVisibility(View.GONE); + } + } + } + mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + + setBackground(data); + } + + private void setBackground(NoteItemData data) { + int id = data.getBgColorId(); + if (data.getType() == Notes.TYPE_NOTE) { + if (data.isSingle() || data.isOneFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); + } else if (data.isLast()) { + setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); + } else if (data.isFirst() || data.isMultiFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); + } else { + setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); + } + } else { + setBackgroundResource(NoteItemBgResources.getFolderBgRes()); + } + } + + public NoteItemData getItemData() { + return mItemData; + } +} diff --git a/src/notes/ui/NotesPreferenceActivity.java b/src/notes/ui/NotesPreferenceActivity.java new file mode 100644 index 0000000..07c5f7e --- /dev/null +++ b/src/notes/ui/NotesPreferenceActivity.java @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.app.ActionBar; +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.ContentValues; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.gtask.remote.GTaskSyncService; + + +public class NotesPreferenceActivity extends PreferenceActivity { + public static final String PREFERENCE_NAME = "notes_preferences"; + + public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; + + public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; + + public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; + + private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; + + private static final String AUTHORITIES_FILTER_KEY = "authorities"; + + private PreferenceCategory mAccountCategory; + + private GTaskReceiver mReceiver; + + private Account[] mOriAccounts; + + private boolean mHasAddedAccount; + + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + + /* using the app icon for navigation */ + getActionBar().setDisplayHomeAsUpEnabled(true); + + addPreferencesFromResource(R.xml.preferences); + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); + mReceiver = new GTaskReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); + registerReceiver(mReceiver, filter); + + mOriAccounts = null; + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); + getListView().addHeaderView(header, null, true); + } + + @Override + protected void onResume() { + super.onResume(); + + // need to set sync account automatically if user has added a new + // account + if (mHasAddedAccount) { + Account[] accounts = getGoogleAccounts(); + if (mOriAccounts != null && accounts.length > mOriAccounts.length) { + for (Account accountNew : accounts) { + boolean found = false; + for (Account accountOld : mOriAccounts) { + if (TextUtils.equals(accountOld.name, accountNew.name)) { + found = true; + break; + } + } + if (!found) { + setSyncAccount(accountNew.name); + break; + } + } + } + } + + refreshUI(); + } + + @Override + protected void onDestroy() { + if (mReceiver != null) { + unregisterReceiver(mReceiver); + } + super.onDestroy(); + } + + private void loadAccountPreference() { + mAccountCategory.removeAll(); + + Preference accountPref = new Preference(this); + final String defaultAccount = getSyncAccountName(this); + accountPref.setTitle(getString(R.string.preferences_account_title)); + accountPref.setSummary(getString(R.string.preferences_account_summary)); + accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { + public boolean onPreferenceClick(Preference preference) { + if (!GTaskSyncService.isSyncing()) { + if (TextUtils.isEmpty(defaultAccount)) { + // the first time to set account + showSelectAccountAlertDialog(); + } else { + // if the account has already been set, we need to promp + // user about the risk + showChangeAccountConfirmAlertDialog(); + } + } else { + Toast.makeText(NotesPreferenceActivity.this, + R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) + .show(); + } + return true; + } + }); + + mAccountCategory.addPreference(accountPref); + } + + private void loadSyncButton() { + Button syncButton = (Button) findViewById(R.id.preference_sync_button); + TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); + + // set button state + if (GTaskSyncService.isSyncing()) { + syncButton.setText(getString(R.string.preferences_button_sync_cancel)); + syncButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + GTaskSyncService.cancelSync(NotesPreferenceActivity.this); + } + }); + } else { + syncButton.setText(getString(R.string.preferences_button_sync_immediately)); + syncButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + GTaskSyncService.startSync(NotesPreferenceActivity.this); + } + }); + } + syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); + + // set last sync time + if (GTaskSyncService.isSyncing()) { + lastSyncTimeView.setText(GTaskSyncService.getProgressString()); + lastSyncTimeView.setVisibility(View.VISIBLE); + } else { + long lastSyncTime = getLastSyncTime(this); + if (lastSyncTime != 0) { + lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, + DateFormat.format(getString(R.string.preferences_last_sync_time_format), + lastSyncTime))); + lastSyncTimeView.setVisibility(View.VISIBLE); + } else { + lastSyncTimeView.setVisibility(View.GONE); + } + } + } + + private void refreshUI() { + loadAccountPreference(); + loadSyncButton(); + } + + private void showSelectAccountAlertDialog() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + + View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); + TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); + titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); + + dialogBuilder.setCustomTitle(titleView); + dialogBuilder.setPositiveButton(null, null); + + Account[] accounts = getGoogleAccounts(); + String defAccount = getSyncAccountName(this); + + mOriAccounts = accounts; + mHasAddedAccount = false; + + if (accounts.length > 0) { + CharSequence[] items = new CharSequence[accounts.length]; + final CharSequence[] itemMapping = items; + int checkedItem = -1; + int index = 0; + for (Account account : accounts) { + if (TextUtils.equals(account.name, defAccount)) { + checkedItem = index; + } + items[index++] = account.name; + } + dialogBuilder.setSingleChoiceItems(items, checkedItem, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + setSyncAccount(itemMapping[which].toString()); + dialog.dismiss(); + refreshUI(); + } + }); + } + + View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); + dialogBuilder.setView(addAccountView); + + final AlertDialog dialog = dialogBuilder.show(); + addAccountView.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + mHasAddedAccount = true; + Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); + intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { + "gmail-ls" + }); + startActivityForResult(intent, -1); + dialog.dismiss(); + } + }); + } + + private void showChangeAccountConfirmAlertDialog() { + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + + View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); + TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); + titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, + getSyncAccountName(this))); + TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); + subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); + dialogBuilder.setCustomTitle(titleView); + + CharSequence[] menuItemArray = new CharSequence[] { + getString(R.string.preferences_menu_change_account), + getString(R.string.preferences_menu_remove_account), + getString(R.string.preferences_menu_cancel) + }; + dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + if (which == 0) { + showSelectAccountAlertDialog(); + } else if (which == 1) { + removeSyncAccount(); + refreshUI(); + } + } + }); + dialogBuilder.show(); + } + + private Account[] getGoogleAccounts() { + AccountManager accountManager = AccountManager.get(this); + return accountManager.getAccountsByType("com.google"); + } + + private void setSyncAccount(String account) { + if (!getSyncAccountName(this).equals(account)) { + SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + if (account != null) { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); + } else { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + editor.commit(); + + // clean up last sync time + setLastSyncTime(this, 0); + + // clean up local gtask related info + new Thread(new Runnable() { + public void run() { + ContentValues values = new ContentValues(); + values.put(NoteColumns.GTASK_ID, ""); + values.put(NoteColumns.SYNC_ID, 0); + getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); + } + }).start(); + + Toast.makeText(NotesPreferenceActivity.this, + getString(R.string.preferences_toast_success_set_accout, account), + Toast.LENGTH_SHORT).show(); + } + } + + private void removeSyncAccount() { + SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { + editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); + } + if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { + editor.remove(PREFERENCE_LAST_SYNC_TIME); + } + editor.commit(); + + // clean up local gtask related info + new Thread(new Runnable() { + public void run() { + ContentValues values = new ContentValues(); + values.put(NoteColumns.GTASK_ID, ""); + values.put(NoteColumns.SYNC_ID, 0); + getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); + } + }).start(); + } + + public static String getSyncAccountName(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + + public static void setLastSyncTime(Context context, long time) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); + editor.commit(); + } + + public static long getLastSyncTime(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); + } + + private class GTaskReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + refreshUI(); + if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { + TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); + syncStatus.setText(intent + .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); + } + + } + } + + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + Intent intent = new Intent(this, NotesListActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + return true; + default: + return false; + } + } +} diff --git a/src/notes/widget/NoteWidgetProvider.java b/src/notes/widget/NoteWidgetProvider.java new file mode 100644 index 0000000..ec6f819 --- /dev/null +++ b/src/notes/widget/NoteWidgetProvider.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.util.Log; +import android.widget.RemoteViews; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.ui.NoteEditActivity; +import net.micode.notes.ui.NotesListActivity; + +public abstract class NoteWidgetProvider extends AppWidgetProvider { + public static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.BG_COLOR_ID, + NoteColumns.SNIPPET + }; + + public static final int COLUMN_ID = 0; + public static final int COLUMN_BG_COLOR_ID = 1; + public static final int COLUMN_SNIPPET = 2; + + private static final String TAG = "NoteWidgetProvider"; + + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + for (int i = 0; i < appWidgetIds.length; i++) { + context.getContentResolver().update(Notes.CONTENT_NOTE_URI, + values, + NoteColumns.WIDGET_ID + "=?", + new String[] { String.valueOf(appWidgetIds[i])}); + } + } + + private Cursor getNoteWidgetInfo(Context context, int widgetId) { + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, + null); + } + + protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + update(context, appWidgetManager, appWidgetIds, false); + } + + private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, + boolean privacyMode) { + for (int i = 0; i < appWidgetIds.length; i++) { + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + int bgId = ResourceParser.getDefaultBgId(context); + String snippet = ""; + Intent intent = new Intent(context, NoteEditActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); + + Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); + if (c != null && c.moveToFirst()) { + if (c.getCount() > 1) { + Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); + c.close(); + return; + } + snippet = c.getString(COLUMN_SNIPPET); + bgId = c.getInt(COLUMN_BG_COLOR_ID); + intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); + intent.setAction(Intent.ACTION_VIEW); + } else { + snippet = context.getResources().getString(R.string.widget_havenot_content); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + } + + if (c != null) { + c.close(); + } + + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + /** + * Generate the pending intent to start host for the widget + */ + PendingIntent pendingIntent = null; + if (privacyMode) { + rv.setTextViewText(R.id.widget_text, + context.getString(R.string.widget_under_visit_mode)); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( + context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + } else { + rv.setTextViewText(R.id.widget_text, snippet); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, + PendingIntent.FLAG_UPDATE_CURRENT); + } + + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + } + } + + protected abstract int getBgResourceId(int bgId); + + protected abstract int getLayoutId(); + + protected abstract int getWidgetType(); +} diff --git a/src/notes/widget/NoteWidgetProvider_2x.java b/src/notes/widget/NoteWidgetProvider_2x.java new file mode 100644 index 0000000..adcb2f7 --- /dev/null +++ b/src/notes/widget/NoteWidgetProvider_2x.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + + +public class NoteWidgetProvider_2x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + @Override + protected int getLayoutId() { + return R.layout.widget_2x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_2X; + } +} diff --git a/src/notes/widget/NoteWidgetProvider_4x.java b/src/notes/widget/NoteWidgetProvider_4x.java new file mode 100644 index 0000000..c12a02e --- /dev/null +++ b/src/notes/widget/NoteWidgetProvider_4x.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + + +public class NoteWidgetProvider_4x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + protected int getLayoutId() { + return R.layout.widget_4x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_4X; + } +} -- 2.34.1 From 87d3f953807546ff86b013adf9f5d5f15ac79814 Mon Sep 17 00:00:00 2001 From: zhangyi <3232645369@qq.com> Date: Wed, 18 Dec 2024 09:12:28 +0800 Subject: [PATCH 6/6] zy --- ...米便签开源代码的泛读报告.docx | Bin 0 -> 197642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/小米便签开源代码的泛读报告.docx diff --git a/doc/小米便签开源代码的泛读报告.docx b/doc/小米便签开源代码的泛读报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..fb9e5f640064c9627b3d33850e9feab84c15fdfd GIT binary patch literal 197642 zcmZ^Kb984-vuBsRBr`oP%s#ve_EK_uE0On|8CIV9b-Eq1xGu3Cwhf%HNdw3>R)QCCI*=nz(7D= zAV5G!|5MGt-k#3g#yUr7Os<~+sgw8yQSmY&r}zZaCPvC1HBd_S1X**krC!2%j4k|= z7eUnKx8qtyy?7&D|AqRNXr6h_yd|a?Wel;35W5m?>P?HU%%Q_Rk2?HSQ=f^q2>MpT z8MTJC&9r9(9n6nW+Py_DC*g2Z+Q;=0K{de@t2HP5d|srkE$M(KE${nso)O9%l=s_m zENc`ewrKfS_PozOr7=H*`JS}!WueCN|86?36MNz9I$IR^AnuR%W#UiQgU8PSaob=I z-4c!YXPcI5*|uHpRA?}2j{8SLxhGPs(^JIH0pMu)HEgwp4uj4x1#5V(ELVtO%jkjF z0^Kx1=B=l=!vyFC^uI1!N*AB{5&pdXbWFA*_vv8Nfs2sRicX3p(ZHOO?Da9vy;#gT zJ}Ap+rIGJvmuM6fylWjgFBmp+Q%#gdS7o9cCDSx9$(?SXB6pUv(5vx}&LNoZ5WF!c z;YYxZHE<7i8ac=QPgtT4W4krJVR8G01^Iu%Vr1uN@((UPi8E6D41mxp@U4RVZrNE` zhms2c6LkbI@<=yA&b2@rti<2H_(Bm2uD0Kx_(Cm~79w^JcD|(&MjOK4Z+fI*H)(JEUOCpT>=q$AnSm&e5*B;W|+C zm>XRh-C0UntTU-D@yavLztn?dy(OYxdl>a28l;^!u#ohfgEOCKD^#v6%pDgN&g~wr z(EI^%%iR;(+Gr`NXgkBiR$89G2rzM>&X+r2MoRGwrBx5yV0&#D0tDDQYJdE^?U!8* zThd<(HXJUd#XB(mq8qu$*^6}gKVOFW3JA+6-Q$)XpI*ynU0XV-U;0M>L~{w=3!cuG zF?C^~E=*h``Gv|=MpAm?g!D-kJh{~V&h!QJk8A(m`xE%LYu)S|jsMr)G|QdWPKp2o zBxwNzg!tboPR<_ICQko&{z6yYXt?P&fR}O*c3%FY!fnG3G_ncv0joig<&kFYg@h zpG(Y`)j0mQ_<>EY)B|LB@}Qlfpn#!S|1d>QZp_XOk9s$*>)SqgVg5tPEVxTezUT81 zw?B98KDp>mjAOj!1QSz9`b-*t!CP-Xe#9R%H+SORBTCN)*=7+xdrVwA@}5^VEZfkp zjZe^LXd;VteZQ`^x83tIcanOkq^DF-y(9s~JV$pz;n{aDJTU36ic-cM+fpNDJQ}1l zv`7y8MvTWjbKc0bcMZ+Kt60tsifp%=ixE$fI()60;MNn3_8B++2b{|!5hb?~_$8{$ z{SHM1mfLu}Jr`q_S5c(`-tPWibN3i{%PeaBbj8xcJhlWa8roVnT$v`mWD{@*`6pfD z^y(hHNoKw~>K8RjXX0ljpA-@)tCbVy)R>H$!4E45Jx(QLqX)*8H9+r z^=*G5qjYpk?U-CDeq9g2=Kg4F<$Jm#h$IWjq5wAYomkw|&V6S1eRelE$71&de|NWQ zffult_j%vw_x_Q#dqQBx*6_7|!?&Bp&&r#cqIO%6IlG;`U8&4Dl<(3l6*aPbjX_4? z96#ZA4|23%tgz{xMpqc`)24sYksZR2wh*M8Dx$84!NmAyq05ba%NTh||4|mg%uqZ2fQU6Cj7RvYqo1Ju5W z4!*#iPm@lcK8}3}Qf$#JofY;Kz$Tu|cHp0?i~D4^TkeNC^pVAJvNd4wMK-CGHQl8% ziEj~10lxwn)VgA_+BHHqcS-A-;rdiJ*7O#nTe<;!&UEpkb*w3CnQqQz4jIM2$)Yz1 zmqsh?xW!Dja4pj%!d82cw4GM-TVV7pi2N2{|05`$lESp=Ok?1j>$BjS;-pv7W2n`~ zUnlth>@)mf8C&eD!1HSdK^oI~6SP)zo|`W8A*;yWD<3b z@V=ZVT2qC9O>Cj*BN?B4q6sx#xa&tUj_AXr*3a1m(|J+)dq@)``ojrj2`6$<0H)$um1JlZsSH7OO=;C*S9NlyHZnxQfmj?;(p$rcE2DI~+bj#3OuaMKkzENH zWOI-z7E|!Dx#I-6mOJr8CyHpJpqh}$70W^71i=&@!0C!tAT5A2^3?cawtX>Mc&+e`jLMLGu`9Z5+10^u(!x3G6$x)O!SZ7!kdLm?L`7u{ zY!jRR&W_oy?RvmAB)Ecv+tu zC*W~L-KGV)s}7Yoc##KT7L@=@_UkU{Xj&9r`BYf`ILERX3b(#4_0L(!YgxFp%S$$| zZpgKVdhr-D&&QI~?X9=OiSDc7*M*5Ht1C+5{SzM{B$DbIq#GtjV@AqBVfIU5N~lLg zm@~j-ORmVu)XGQn+qGe-4YZDv2JOPMY|uq#fGSqEJcWjrcBw?@tTMkQ7nvG`8)$J| zC}}1km=@!o>qd!l(EH;y$5Ct}W-{=mX7}z)pFxn;c{pGLtq8$211m-L#nf``-zz9C zd)}0um~Ynzj%gFqrGHCkL=Ti&;wEh?a!%>vJlK8?lA!9Q_7&r$^%c|Ixu+C!s#+zJ zQpGg*IFn^UJ8Ur7TkPT+D@tHd0E(kgV3b0kz$y2F0{44QHoxrTTt&`(;q{TueX*wj z11V;2(t4<2(vSjzk+_QShT?$YWn^$lSCN0;I^2&N-Ej^mWBFL@0z;$1=>N(#Y58t6ixU4d#9GYBau>1B!RD}E%7t>vok=)~fRoY{Z;k59qNDL5(#_#( zxsV=t1lMkIYj1Q|lhR|OGeoYxNifOUMuRO!2OS z*Cl7|)T*_8Ul@kE2KS4=)47)|qUzBrKG^2D^%#|{9)!bJs1zoPmW^i>eb6)(zTi=` z9rx?F>esKx;Iu{pu1I^T6Pqq9O_a$gqQk<5-Np4kI6V0}0X#?UAv^2l;ucCf)g zIHV+r9c@?)5iMSBQ-r|nmW=M$b)A9oBrMX9Ss|&jf`aXA9?E68RUB|z`Z)H#hEop6 z9?62*7u!@pg7HwUw_aCpsFd4OA;9KU5#ah~vXQmxz+YDElL`L}1j;&+6=~QQ8_`*z z@jaR$=RY(5uMz*tKp{dqs?->4D!GM`EEwaWFc=APJEC}Q4{QWU9tIC(MQaGlM0T`6 zQ(V;VSt-63@_(22FMDA2Wxh=?yCnl@OJGL}7TQ#y!Dd&ED(XF2l`} z*nNADi|pGX#o?^Tga3NE6y$%J2j)m@M+Ft~Z8)24Ifp9ww=-k#s0ea8k)dD`PFM#; zc4(`&A&2r{o)OHLG*a=gqfiwU3}oizl}Y=rd($*jWQHT+l6Nwm_>u$WU_As!z&}$1 zD3UXK5EJJmA>O|Zkt``a3F3$a2w7&1xnN$jvI{2Mb-Z?~@;e##6ig8_gC;2$DK5#1 z8*3bG-3c6-Bnp$w)C(iCj!{ybtUhElCuP45oK$yZB_KQqtxl12L+ z6t2*2;}+muh-kmuDM!ag!bV#W`2eKKPa5q{wp0pIv}8eXQC(w8yNhu7WT5`8c@CgQAE%!8#JRnc(qT;S6;a_!Y$wXmK@)HHMKL>Acaut z%-A`T99XLYY|S%ZK}NUvOTK+5n`+?V>?tL0_t^P)-}oBPtr4^vr)to9>S^?1 z_xTE|D2D{8PZn0-SdPqvm>=)0Z+s8jT=D9Mk91ke6SfUn;?m*~VL6}=Y>g96Pu%-c z#+W9G<@64#n-r~SLyM!3(T%+S#;D6IoYr1D7Uv8cr@9IY{C^?0Rd78W(2TvnV zhDH~Y{SpO~Pcw|&nt0urE}Fo~ju5@=Dxch-{;hyRjFM2x`Xvl+Gek;p?Fr~>D4Jmy zerXy9GBvK3L}B2Cn`?=ggh#m8taQld;S;D)@F4iX=kmwf`JbEi!c{>hJ zPUQhFm1-UfS(B7lQzGew(@Q{^tmkG^&HTGRhc@m%oaaQRH%msbjw?{DVT1xW5 zR4P3IWbbDqXu};^<-yAyN_GvCZ52>D8pXs)*5j68uHf?@Crsd^6}Y`(Qp3N>Go^3n z&3B2`vIZBf$E3X+JDY8RY6q@g|lQMC{BvO7h1LfI7BrnZgd8+Fq~ZPT?oLCydr|nZDXe- zJ^T+0Xns@q^%cwOSh*nx+=Uz zI(pW>wJy=4_s{4Y6t|d(5PoU7&p)we`B{Ld_{Q_A6DIoD{An1!=jQOVs$8Mj(8=_@ z>)`kM$jbA~`+Tmd{knd0eWPMNmR6aAS>Tf&qtTq0qsr)=7u|aQu)Dx~(hR(`4mzv^ zSYOxXy{|4nMDpTD9{G(zkUkyAf5QJ~KEKh}HcJ2j1Vr=Asr*B${442nGI4gcur>Qv zPT8!X>9ody;=5J(fk@Z2MkEjqP%V;Cg_@;IjRU#L=Tgz^c6;l_rga$hEhRXu9Zu4Gr9JjcHy$hy`Md@vU?oJzmejU%odxr zD%jGqsdekB_R+;DC5kY-v69dYraEbMzi{+u2~miuof0_LON8tSD2rZ64gJkyLIvRf zLZ5rm*b)PK88M$Xp;f6?yTq6}5-}PCejtzX{1m=dM(RVV4uj!A6PTIZ9Yk6N=-A1$ z&b3LSj@CxnN1WY?_G|{XH>h7|hF9gRYj^NU#v*slQFjhUqKM-5-4_+y?lcjPPh#+A z@pO}nTstMsVZY)Y`OD1tSNxA#Cu+wHSF=6#(g6>su3m3(v`5G!=aT18>nru#v<8=^77xg|?Qea248P?QD_~K|srhb7 zt*v_eSL~$@TU7F|CwOU#qM}gcdX;EC9~=mRIr@D@7oL!o!vtHksZZ zkWkJ-KIA%2T>umcb8wE!3SmE;kw97h1u9=25~HY(IbkaR7Z33j&y$}s2{4^M$0DhI z4I(K(^qAGpAc2BUD3!x`9Rd1_Ag~ogzpwZcbsgXqmT3|#l(HTB^0wwPrWqDdz5fu| zKcntr@M$;s>^cTe$yJ_Ev%hUie50H4>3=EnEqn7oM0Lu|hy9RKb<)Zeu1K`^v+@iE z*I*AS-Bs+=o#+)h6e8rEK-f@m>p_1GT-Ht*bVm5kV+fZOwl~_O-HsO83b3iAs980 zEJF1yyPR{wqXG!1J^Q1;K&ZWHI*^C)163@6r5l7@3zmxENu*@6f71QVJa9R$LS z795<;1phOo16khbfhKud9wlz(aomm&Q$0wq_0|y_g(csn?7U)T78z$aX zO$O~03#*;`E0K#XUr@_D`GdtQ%*;%dSlux0Gj8}^6ZXHuiL<$hjmiIFGG~5W4LpCdoFte)KxqG|_%C(FfAN``vUb?) zNL}d1ej4Xp^~Pt!Ohk|^e7lRTC?ZmkIFz)_W8ob-@yWOwk^36?0y9m+1;CMdo)oJP z68=BTU#+rBC6o#L3WP5$MWs|OF!(S;&!Yx>n7y+xy9w3Re{IH9xP`Y7&{(`4NRw{$ zkHmwMKxchk_&yblb(51wfrw}ZW_UnEDtWd-#yE%1^|VO0%r2459iZ zbPOrwwpYS$FeINx`nZSg<0nr?Cf zN+pUFK!r!WM%i0rSlBSq(1c_}qa3f0W=auJ!OzR%uB5k$BqZFY@1iawx$1tTtsOx0y6aAj^b0atlql8Ax4?d32^=u}Qofq!YVON}$lpOy%XDD$QFFuM zzOamC6<84uyK?R7Qf#>n{fZ%-TvL6p+hL`+`>EOI)ZK9LlT+pcxEz1%n=1K^!(ZDz=qqTWOi{d;-p;BR)j3wwgB)TkYoJA`VA4IT$ zoJUZu7#or_Y|B@o3MO6Tb$4Uo)T zFveroUaxU$dA#DFN_aU-++Q0-hd7~qV9mtH`D%~vx9 zM-a!usmSzg1|ic2b0ZUR$iGc4@l4gt8NVC9uhiEdROB^Zt`&GSjL~dmbV)T}lx3 zs{CY$tx|zWIGODOS!ZL%C|l?P%B5VCB^X^_c%%{D?}v$GTf7ZPAW}KKi#Y7V}G1csfy27&zb+&x-%S!KP zqAbBi7X`;Hgma%AAw|7qS2YL*67ZGVs3r?2NG%C0Vb;=?kkP2gk~ev|6$Q39ON_#% zq738Iw$>;t*Q+)%=$>}BDO5RfVka_!(1QL%zSc(5F&1W6itdv!F&d{Z%MtIK650am z29@aqgB2)jJ&$%0yT*hN+{Ntqb%ry&l&w*z3+z#Fp|n6x)H7%MB_&p%pbcM!s4Syi zszJ%hOZf)3DJ)OGszqjS!E1BITF7rS-abxTxZH}npbf)?zG-vUU-Joz{Ces9^mVJ2x+DN8pwgK0im9T+p3ncN^jK=NzkqU$^Yz!}tq>ayE|+4)&PIdH>v?<0HdR z9o(lX6*{wP3CI=mY{=ZnX#Cdt{^DXJX$R017IiB5oZLabp~w5Ral5x=nWf z6C(B1_vqg>z2tIWx?Eiw;@P?5kWaE{8U|x;Sb6IsIOzxXEHZ9P=Sy%0lA-pnw&EYlF-xoUSPoA?4^fex{# zmBwQ`XgS#a5@${y7H%ez3q3IS#YC$AXicxs&%{Bz9*E{@k&{KxH`2 z2T?MP1mH~bw3(IuYmiwO+sgAVIW$-~@XOp`wCn^zZe52aDY^^(?X7(rho6%RpY9>6 z_V&`n(D$xK5)T`m7lR#YOPgP@Cp+Hl40z6qbl%r15riBt?Tk$K2Lq6Q>uI|@ye73X zYJYvYUEI8^cG+olt#a;mwg3F7W8-r1u@QJ>?cMHnknwhrBEfA=(JF^A)mUiUAod2m zH*%ica52mH79C`Ui0hqAy^Q9qA{DphxgwW0YqL!glkr&Q!j(oVhs|JcV91BT{H0`I znJ8mU=hr^iT(q+7yNEyj7qrYVMCxW9;LA(In3pz3>a74K$CFAgho47fEb%jk=#q*L zx#{Q+KkorRK6w^%t?9ZyYiQ{D=6F#wbJ7aQNNy8|TC15B2VCl}XSXp3`T@GKVU4*gRIGEc6+C$wDvf=68-FRyh-KLoZo1X{xt zLoMIv-4@bRWbEiKEQZ*#w)OYM$g9!~$Cs@A#KJoV%;l0pfo~%hnSF7gBxx4)_-}TM|GE3-( zsGOo^_eZI|57VMy;$O#u$RM_%VWix(zx9j>bf5`OX1~yyt-OyZWNhnljASI99as<^ z$fs6@&BVi+Ph7$9!>G-*qv29UT?gs%TEb#+R!ajMy*%MM2<~a!l^9gX?qW+JP(`l7 z>^d_%(m$RilbJJz0NyO}5|B9J&rw_=Y=6x^oiw)Rh=r-Bq0Qeo&7`jdSD4dfdv?t6 z*cjTtr{)&VxR8GIJUqLIZaW!w5aj1T%5n2%Qyxau72LQ6^^d02Db9HKoxewjadTWY z7KuWpyRVmxg-Z?kU_e>ZS$)}<#eIo)4jGK}-v@{Jv3xnaT06k_z-N@zuVZqrrCat- z9`Q>WDFN@}*#>&pu~vNQ^r)r+*VC9+*Hd8aZ5+Pni>$E-ylx!Baaz+T4-igkVTJvH zI1KrXDMpZo%vn=u7}bbFZ=kg?ADSP}HvAU2#Bl({l;k37=$^yiiLtR~au)q3p$}Ac z$-}K9%Q{I{=O|_YG>X|ndgUiGW~U?5=j`Nja;k|wE}I=y6U7I1Q6UI*MIq6cQu@fN zcXvdd@kRZ;%BG-f8FdDZgblezk-U!f~jW5t$_zaR+ zpl$ch>E)={9(!DeTHSDa?Ric(C>+0SZ3O;8Ox!p=a)#0o4IJE$8lZzg?@s8R{kA>K zcno1PRnY?GIui(>rXh{5ba+>u_rPQ+&C2y&2&ny6h!0NaN=^U7B+ltrjetu+0>KM9 zh?=I3+zO7G%oy?Vz%K?xi|hXW{gWEC+0^79QcEI2(FE*X6B75g;^ z(H6O@M`yt-h{dvG8ZOK8g+q)bMrvQCL3=ETP$4RjB|hdoy8y##l@FE_s6u)J?E(}~ z%P`im^f(y)Mq6SzyE)}C2oaU$wC#{SpvGS*JL3nbCL4wMn3Cf7N>AesQaM zNhOg9mI)|Z=&EH#{bdz8q8P{mR9e-+Ec$b2nYA5s8o%ZajO_&1r7cL`_SWCdO?rX0 z7jR@3zDF}sRe66jy_&UjHE(RY?oH9xQ?6F&xt=x3(5w@|r56FY)o7J>7RQ^E)|M4t zB4g$(TRrysb->LX(=RN{$|9^zA(UR)>mBQRu%ei$SrZe0 zY0)L`f<)eM#jc?>{J8<_iewx+M-z3f8i`BcdL1*ek-^u|iauzVTTOJwQ>z^`$iqD& z>I?;0sihQ_ z7~@w~42+RBY#UN9zy`}d!XNRJ2F~6~BMaL<2e|(nPfVz9ZN!C8aY)JlR}f9U0#p@L zX2?}$66_>KcQKUZLL{~MIT3)-^pC^cwH?~~!nZTi&-HG3iW=MFF^q)H>XTV>q))Vh zGZOL(fE{iuJ~Xq3VFUZ1cSsxX`NjYqDJc=br*B#3K~pGjs;wG?Laq>}jV*&5UFt19 z`^D5{hUH6K34gf^u{#qCWoZriG?>@oRi|f0tACV2j~LlD6ld_n|1y43(#KGg6m3Ry z9(pa{vjOq+SAH3zZ80-k?=HQ%O*V0Nc1Y$~b@ zqCKHND)p*mwn_G1(`$V`vC-8Qc9s{GMiQN1l6ni*OC22~O_C z(s3k`evPJyMQe2RD(r5%&fJ}GgH;VTlxpE1CGx$nQen(54Y%!xiAIveC~UbdX7j7} zJ*Zk$AG=W3;l?1OjHIieEaWI*24(w-hy2NDY04|W5SSF4OiGQMV}8s3M;fCS zGqdLwnbwE@PyH0b?ttIHTTLF4NCf-9aAA>zq2IG4n;|VhM!}o;px3pRjtv-jqncDx zI8ja?6bx}995EPdHi@z~Nq{xKhm6^-J9%nbY%(K{(P?%*>G<&jpNWhcgHR$#%u&jK zxy~yh@oROwKAhkocy1q5_G5==w~YuGivD(ZQ9M+CxIL2D(<+pvl1GTL`QNG1;7*n| z;plTjK54g6zeXPxA;+*Nj+o2fyw3F(3{ChT7Q|lWnxbWGQ`i_2WF&Y=h%`}ZO*-7G zz1|K8K@RC7IJU}MIX)08XhHqgj)^dm^2}eFmWJ16dA%be?zxs7CR7H-LCVW2B&1lX z_UDM;;>#+tyjTVR!oe{RRZ9hy!2X=wlG&{yZ~}DN$T+7I-@{I0nGpa9B@;0~^_*V?IHVw7Me%7_NMDJD!%+E2 zHj*|mj#gu49^-Ggd(uNv*LiL)31Ac;9B)Q&uA){mVD9ib?s~zD*%2JM(?T9*gNyG5 z3+<3eb=-hiakw&7vU)^0!(`5l?qu^ zRzh+lqI#V-8sJJ50i0+I+mOhpvqkfzO??9HQmds0Z3rbEYDrJGq_(J75W+Uo;mf&@ zj{*_&MJT;{e@)q;W1dZ3CPW(cA=TMkgPUROCh)?xlxj0DAIJI^j!7p?Q3qfv#R12kq=BzBK%@-2q-#^C@do>BL6;= zkUE2sx(fzP#to0OnGq^!2(HZd5MFz!hw`3^RN=F+YaCFHm7$>F))eJU+&kN_KwD&sG)!tcug9{CEcB%!IET6TjDtO7J zHDME$o=L%-wV|_V>npsYNyQ5~l!gHdex$UtcRve4G-^SmKe_Mq-M12sOF7;7%oQMf zF{qVoeu5%u`xC;G0f@+*mt5`w+$6onO-4@UcH3rU6R#LS^m=&s=v;^&x7=8nQ6wc! zy}R@*fG+gWv7OI6H>u--i;x0!7y>Qd@P6CI70y@_RD-E&6H) zkH7hKbsd`ReEBZuc04H7bL6(3)%pcuZzpm)ZRzR~wmq(6FTLY0|AggzCg0!of;-yC z7{cD-Cw*~xhfvS$i;IzNY;Fd>`n0-wl;)`Z`8Ai*foltP4tkj){!qKr9_Ajepev6F z(qCpVv|vW6J(iP6K==LZml7`2JgKj(b za1cG?aW`JAdR{k^UGBZQ8W0Lc8{I0pK6`w+V&MqHy!W6+oWqX$eD2Us^GocN6XFxNK)h;faC5g^ffUn40`wyS@@g7`+XFs$LKwnnkj*kG(h0Rw5l&{4 zn$}W@XxnTCYe(oA0wI4!s^4i5{geg+l>@NJ9Kp?u%Ud0N#Q~+Qx&jEuNeWPeTe(6_ zE`g^5A{~tY)G1=PkL@2%sH_-^I)9w;TH7l!dH=|x8 z%VW0`uO*Wf8(iA8%Z46sDsK~$jR#c9Mw&0YQMkppVRrp1klWs(UNr9d7is+Lc}qS%2jAnV7;j2b^s|AHOmYcp+7^JBed z)a>2WS{aO*RKb!&0;WJY+Fx@3z#|$UbV1&{rp0;JfR%S})R%RnN4D=N^*9U~Eg@gT zd`m=H1&|w~5?fG5l~5-&t1>(~C8jd@(ZhmUKecJKrGU1_3!;isbW+U&)!zDP5E-jB z=nJX3qZM*FXJ>hb?gmu1oJ<%Q4~LUARzaJxs^n%Uec|#VD28I9#?Yyt(Y5do%wlN`AqL&-Qp<+G@5Pr>2)+K3aml(EPAEan$U!^_%{3-uJ7b{r(9Th%OdYgyK=q*Z}4? z#kLgF_O8lxX5z=76suOBJ*BQ3eh3a$14Vkg7_s4Di9dCMe-t`lQ0VZ0LiN3v`7!hM z>-;Z3*(m0ld%Mm`7Y!Bxbn{}wSZXno7K?XcUk#fHbBit(u;WT?OW$gZ6*i)uGrhO2 z*9S(O+Q-q?qi^~a@H7e_b*`sQmQ_1NiOWbie}O!|xzU_oEx{c%awG z&!NfNwvz$+1=8G|+>!5^GtSAFYH1T4xSlE47$o%2m@jN53lH;@M9#phabl#>Iznck z(KKsia?J=qQf@7;4MAg8kcMlp1ded4{7h5!2as&SQsb1eLzUCoRBu04%>)v7HERs*$D|NKtz;-a*3?F&27(y||9x~p ze>qoLh8c4f$}|3MU1~cWIfVA zEUMgKdiL`f+G24THZ; zaKyA+L8N#4VQdl+U<5aXnMmSX30k7X2yjAydd!*FwMC;rVgW78L$kCVY!4vDh$RJ% z%qWCfP%xD61VrLGQ-}c!xq%Ei2k%m;kZWyV`Y52JnV?WbC5^#p8E@=z>aXNzk__Om zgfqiVyF&-HRmfAlbJEQ-sH{p2?caR9c~cCzH)GpbzTC0w(<-6pwE1Lx(K$|6vTa3x ztG%Lz&kiotal}O8W)3^Hn_iIH`roCg0tJ;P7)B^Q1laOUe)j?+va;Y0!I-PMvR36^Ay9PH^Ozua7~jl>@j^ z*G>K>1swNphVc&gm(Q)=@@X3x+~1TBd$$*)uhDkf*U}p1?OMmfY?iLQdiUGe#ld40 zHXJQ&5w$2YX%vL;t|z5X5ftqRR7|V!u;-K#8s_$#M068P22y@rBpjTmd4!000~vE= ze0F>?A2Ewc@Z9KOV*GBPy6oh9`Y_q4jECgSO7Eaqv9rL%#l>rfUDr|-lHm$36sm$6 zYtEr+5ow0RX@z5=U^*CUM$dubiC*-@>`+C&;p~V5;hgASmYQ&Hc|i>#!SsPh%8(f% zDs|hSQC@5~|6Zkc!+T4yWXgp$taF9As#GXqZ&`hSQ-Yc+(K~{~?RD%kk z$n?<)uIS4C#OMJH%^wO8+>ryB^9FGAT8YTbfr=!l5+r0+?SHefQ<7P;fk<5E>&X=p z#`%aCClxrO_RMqZrRY9#8^k2u?_p7j;1{(bq551N-EtWVVb zVW8N_AOJp!_bJBrgB1#RO1F0?kR<-8WMQIXCu*a!FAUOU$J7bOu=goUwe|@WmJ_|6 zS!T_|WUFg*{;p?GOkyZz^}2Gu<1q9>r$ftk@NTaKef#93(k>B#p|mW@7{*kxp}kP3 z)?^N01{+c!{&4yW3{VMLnLReUnz~r9{!)uV!xUCAhw-uei39XTWIPxMBC8c`Ub4At ziex7x0^_q{2xe?h{F|!06C4HxXDN$=-CK|WUM@-*xr5z`16Zp@k7K7bL^ZI7s?sO znPzwuYXo5n^W_}=O$zS&r=rl&Q^Vj|g#|StRqg!TkceF(^R_%I4oW0AP4qQwQ_su2 zL91$tD&LmzUrmP>J?NsQ8lsR)itULb&4cA@2y?EMe+CE}$;U31=o6tv!|^z0h!Tm& zGg5ykKZ`O4kn*Eqlv!1$GL=JAbB-%YL=bT-i{k`SzDtq3Cl*K*n34{$GeTdVxv$_g zj=2&Vk>}^P7H3od%m(9cD3JQ0_5@NB?^TWOmO9a=2+a5-i}9CeMkqsVHMyXFmvAvw zqMjwmRa>iPJFgJ76whh#vFkz6$Y6E=Nd`@)w6s7Z%o*#R{f?Y6jUp%(=tT3~An7zc zqh9k!dR#Y8E}4qc4J zHo1rpHL{?^Rxy+D{eLqpXlonbirF_;=jQU34;;8L3SxmW2u35TpATqI@@4&}TUpl8%Piu!)ev!Ji;ZYRo;FICuTOB;dfmH|TiidSJ|*{BR{v z&?Hi6eT|J-=-q#b$4^}O%o$Lwr-<0xr+$L)!M*4ewbn3_3dpf~(xa7m5*_+W}TY8sxjH-ydqf}zW zr8U0MO%ZB$Zg^JYJi-?W^0(S)Q{=(%&*g~zHEX2rYmIYIAWtmZ8BAXgBwu!G4??WJ zZvD%j58r^Hr>{69!r1^PlWgd@G*xYAf=!EC5|U8P*id{#-1-NJ%J9o*ni%P`J6$@^ zIzb@SRWsG)J?XHm#+#AL-lWx2U)5@r>eFY(j|P`Jr6aI8B|<{;^nJD;6K`smu>!$y zRy^0aJ3%wh-3_F@e?hsiq6_{UiorKn2%!;#`~bboyDK8BUpDwx!V2=IS31aA>>BUb z<-B5L4q?}#>!tJc($Wl-$~=^)($iSTEvRsN1#0R6JwqQypgMzqnd$m2kG8BVKp#k& z0{#dld=zI?=%YAEV^jFg{omTS0H%5nM9RAx+B`Odn|^`k1a0BN@!|M#0Za9AXkQAa zAIIqZj)4NHt`^I9*p1AwqL<(=c&i}0;9rmpWs%1jisou41*ed!*d;sG$Z&~ajtUs5 zxLhg{MaF1#G?r=fxP4%dm%}*RAIQ^>5jte5p=aUe#bHCjW_)y}a;gY98RO_w{qb8? zeGXFnVTkHX@vlU>FLfFXu=eoFv&O3d{kP8sellctVVt1}2=b*);O=fS0s{++RHV-! z^SGTAEq-5eTUf7vWa7(d6;AX$P^q?PX4RH}-QHS*=c%h7@2d`0A#+1c%f``}p%u%v z4T0LjpceC}Ozbs7Y@Tlh&KMqR=6vc>2e%$9630&kw{^Unmi3F|5Ox8wZ z^0ohNFUlL7PB(?nZM(8(3E5TXZ>He!F{|Z@$p0Ani_qH;stR+4Nk4wiK=Wj?#MMdU z-l_771Air7Q;0v`X&N#;^4|XSehBRkdoS&=b3r&CjAsVkBsvj!zN|CEQ~EvfS1{e4 z{OuBt7R8Ry^TzVp@sqvL7;&oql)qL%hO7{>03L-^F^^c#nIao!0(FlHgmvn5VAsK3 zxNQ3po%3H}(isKWkv!S-yJ;fx>X@84A7CZVsBm6_cEnf?m}}s?Xgl$z9bkgj-kdD3 zJS(DSl8^pJF!V+ssq3fQ?bhsS3h*o1Ui29$*qH}CpxO_NFGvMb9>eonwD*JL6i87kna6Yn z>^hCWVpJ;)4uq|gaHfBP2y~DJPy4oNwSP}*e(^i$S2m2Yrakeon9)$<_7bfoa##4H zQ79xA*s+RQ_Hc7Z@0~yB$2eWFTRUT$Z>(u<&w;TMlgCzMQJUQHV89HkL4Ql61%WEb zuwl;1L@o<{Xs7NAM8TIzWI)1?zX5x2)3(eH9EY#uGPR2^wWlUEr$x(c5L3_zTr8-4 z3lW6uD)F`T#_BbyFK`@4gTlSdP;HGR zw!N~+jX+F+(pqtQqEfS^@B(&juAG^el`fMnSlG>Y<#c%x#IoSn@R&G)bX3WUR2Iwz z>oeUJJ$@Z+ew#2Jj9c}{2((UK`BAY>R(~N^F~!sgQALdMGL4#p>5zyw7I1~;cx&q} z#Xjk;{j&|_ISRPBWc~v6HWCV{1mULPPYEi3_q*!e+e>L~HdRqb4CbQVb`82YUakWJ zp&%~@r-De>l@uPA(QFAR;Np?T5~}Q@DOp8M#Gh9?mb6$5{rL}n-|D_E|9)B@q86dX zsXsT}#6F-e9Tkny5lL&?Qyk>q)Z`P4dJUf~5>kLHu%C^XPZWVjsaS|oKpzmN0sgv# z=Gv5;PDpXAPF)eF=2;O>g9gjGGC(u)ZR=diES)vCl?)g8gJA|0&jGVo+?8KSYoH3868t zvj{v&=-O>BHYwLN|2QmCo8S5xT|9S+Zl?u#otYnN#o31mC3hG_wbK|^DyN-4J9Jb$ z0xt9SVE9AsWK^DFQ;5)=(iK=&ZD9F){pFMuHs56A;8hrYV6Cgd`&WFSI+kFG16F8X zZ+#Eir|hZaCky8w0i z-WpoAPsip`IH;Y)8{M#XOIopycA+DCM@HRjPy$CPDn}<0k{nfplraKls-oVgC-e8# z`d$|ynBGm7B`ys9k*z-kWM?lXE@jR{qJXFVfxA%X1G+bYVg`Wh*%-^dSkrg9Pkp^1 zA$|{lZ(^c@Hh4NcXSsY}{ISx+cDU}QsHGWP{9$)N#eUr0vcIn7NXSj*(&Dh#W|7>s z%;Dk%0V3X(x{BMl&~A~u&g)%9tM#iA#Ko<~&H;EwGG}~+&1UWS6!(zUUDf+}(*cq1 z!1mMQK>O*|dy+>;kLy8Ipl9ktJ`WxZH8eis z0NabX3#E{Dy#XZ<{@7tsXjL+I>LmiP3U`~6$}TT>h4~A6KTj&(Cz8SXQ6deZ!^6b; zmzVdKc#DmDT-^vDj_!8)-O9>2uT~fm{`1H5`@m!(8y|My9mp0=@Amn5DqD0z2p2PG zL-ZRMlD)YF4A!i+W2p>Xu##BfwAd{mi35m$u}~zk4{Za;`MR7RJ3q*bQOnGH_vZ?~ zlIr4%4a>yPlp?EZvLCj8k1oO7qe%N4Z@qThJ!tmM;JVb#0^fn;HOKU-T-OmWv6WzZ z+NRO6HL;o3{!v-ERzdp?Bas-13(GfPo(!<=H~FAJS5WK`O(jE0F^<&)PVf~9P#me} z>mlz0$u7p=O&dDCUuwI_AmrN372ZCs1zOA(I>@P&wAiCht5)FO(0Vu8?P50NwlJTr zzgzFV;a{HrFmY6pIi?Vs(vxe#lAet&m7UopDa>b&hwl&ftRoLTE^+y+f4w6piDb*7 z_Rnex9cm62lh*>U@sP0&x44)#O>C9TOqk_VoxsiJr7_>o5D4t(xXUMbfCOO2d&1k& zM=!#;bjQh*zjNk0$K{;Dk=A| zN85K+#`7B64exG0a)4jKuQJZ2qH6Oii0p1FAeco+d!>o_)TPT)5nMR!PK14q_ zj8kbYH*ey~m(S8pz&7&>2)Yx>my;*Boz~^Z%Z`WNH4zeA-?4~Q81{l|u_I>L8*j-| zFADMbmDpvbOBUh#x^_9OfN3E;YPAw*(<5DADEKN}z0Ad|}_H=DiRkU9v%F{0ZR%ZZGeE{*vPd?DMb z=$d#vm9?H**+6BroDM4&R5~5Jn;}(9X4n~oQ5y*jw+9~QCO7>XeJFnJp0aFG*IprH zIExK(qDrbM?>b5^f9uJDAPO$)Z_LSVzveCg9$HF}qM?V!n#VOom!(E7Rg1%_?tAqD zx0jy7r1P^uMHh>sj0wpYxh^&B*F7PW1dmH9Ip@Lu=O#bQFMLNw_MJW|cOI!o2_+E~tS*)rt*SbmLMRxXQK$MyvcDn;3FqiO@vWVcH=B4reA0ft)V|vHYX$JNRdtz# z(Wkr=>Z}L4&+m_J4`st&XDNdSKWRV9x+-Ikv zjN%~l6@@ZZE;K-b^!zJIsst%?oEWXL>SCGX;(C8$S6B&qoRXbTgKIZ44ab;yDZ4;F zGG&yUU4f<@DYdqxv3xsx##ZDj+O_{np(>e_%LDXC2u=!JObW0bZi;kHOvGt4XFM`k z);xMFTW>)42$YgY4kJh+^2#U_Od@jJmoGl%&_B`}7G`t1_n~1Lx140Q)F_G2%$oXN zVe#cJzn!etMY<@e@m<|s(P&rjh)@8PpCX=yABOUS8nM4Wb6-JRu1#h_gVt1}ryjgI0bAIMopOH$2g#3)(#5~**sk~-)W;?`rxSpfgJ zbtC)&C)fCSth$*`(Fa#1Nk#U#DQ=7Jw=$}E2AL@iNkWHZ92Sa3pECoTh*09lSLpvR z13W5sO~kMRd@XTLpmU?mQ@q2k&=0y1$Dv+;PFwPeh&QGI$NMId>C(xm z@X_zy(Q`gwVVHvxCeG|OXgACjJGxh>HKfN~%N*A9o8_z7j`VxX7K*?>{rGSUw-BxE zey2VGt*HJ_5aYXJb;kQ&+yF^{PsD!s>|ikrHe|M4SX23v&=di!03!MWQRs9iz%!DL z(cyIag!P?Z+$bH@wXjx4N;yN;VHb5`S^#5HnW8|FESxaW;e(i2Od>O4XB!J!pCf~q zg6CjK7v?^C>N_DeOjx;%_0I%VXts2!oJmn(0vzEvvY9|T(=@!@biCJy{C$VrK=IZs zFr8qB)$LKQ#2$O*(KdJqNcb&Ww@LEn5IX;2j=+rQ0vfn)Kx|9X#?h~FuFWnd7IHps z(uYsqtS@^Qg!(=~xa*0n7%913FLC4eyV|eH9?V&0Fq!pDH`(*uJ`thEeRste$-IxY z?+)ql0pwR0RB6;!F@Oas|LQ)F&C~>}Lf8ym_3PK7(-OLKv!9MCHF&(H?|yuve0ZvU zN9r=nkw;wynueEMcBBgJ`NMcDoc{WExH;lv0N2!b_&3)y#v&!_`XqWwSUibQJjEC1 zhBKO3U2B-!{VOPQ(mRgUW&&-@yZ_IK+ z7b-1yBR-v`$y+2EfoaP`>*{)I#{_OUqzY$N1gm5x~004Av6aoN-pbmWE{WP+W-@hi_&C1LZ+-z^TMQxB2M;9^99zt##m}B{qF54AagE zeHev~zdCY|A*eAhocYIxH+F5^or~o#hRaP?UD}?ytGg)@dJZ(T4@bU*|N18?6DiGx zocM8Zb@ZI91wSgDMJ7H1t=|r9P!A17)@(^t8a8`IN|CW4)MhiZ$f$FRy^_aDj3f$` zXugKp)Sao+KWumH@5qUTE!WvqI=sP?h@O%e*3>$Kvt^#R5C}YN=pfqBB4HPdhR{ae zss5hM^<8w_tcsQ;R@Y z#xcLRf?+D%#|ZVd+!M~xGx%{Vwb+R0LI1+_lol*|Rx)x%6Br(aL}ga|h~G@|ig{7i zco8#+QnZV572TZKQ(c>1JV?|Sw;izQ(}MP&tU19nkHyXpl^X7KaE7;n>m=!L1;ctza%VDBaot9C`S9;??UhRP0q2@!Fx zLdK7bT;PB#yi}ind;8-!`*VNFbY)n|0|b**wjtZ0&vbMtLq3Y#ekdcaHbZ70vxg04 zGlq_yKKEkn5_1({PuAoBnQqscD9y6UWBd18ny&w_zO9m{_G**p^2p`61NKE#VL8=);z%v ze7PZ_B5Ia?a*)i`BnPgg7+*Fg6%?ACLP3_F9gwD=h!~R2#8WSI#Y5*nAo*fN-DSUk zK;T&=<>bB!TUbrw6qEavK7>78VuDA{WwDYX|6;&P-ce(U6NsY(#u3V9=Y=QN*o8~n z-bb4Uu3G?xW7R%?rqj+;7cl{-9KLPgks69Ys zKXS!zHo+Zi&JC7Kci8Mxkw6L#v+D z>qNB#HZ|U0coO;X951K|$?{3IFN~ay1~49^(YGCG%g(kkwM=w{pr!l(I?%~&NZbx+ zzi+sH;$)31tc{ZiVMffoWZ`7Q!M1p!lVxRCkPZPdfx1kq5?^5r8~U9lqN z4P!4;zc`?Z;LeT7Qlt7GJTj=s`|J^yO_vu4f=*7gKSS0p@(!fWc??O8nMLRW z7V1pB5(Jx=yjUp(IV4}EtmdS3wQY|~G81a{$|sAFs($J0Q^HVLST;zs01M1K1X7tg zUJi?!&Ds(KMj5;sgr^LfE6-O&Ck=}c*|nuLOqVi?&E~%xGw>LesA%YnRn7`Q2Yf}b z0>9z+CkV&pP#EL&U4`>g+U_^tYg$x#%(Qk(mUCn1I z$FHJ0gh&7KwV#<&*X+qH(?~H*Ukfmv4_d#*pJH{7Tv{*OZSB}E0IG4 z!yS!;`Ra$K?ljJ5DmB@(ZXBz;fX_k%G?xR6dKYnIIX+~yU52SfjSwgTxjwF1pK%FJ znAAz6fN>{L1Mq0u9@sSWR3cmHDuvMS{(aml6FApCF&%g%KN6q4H6WY)url=S7Uh*L?et; z_aQ=Om|d*8PKa32Ov1A{7_|$Io3E&pTHhZI4%lcnLi8B@f5&-a83hwVRNR-KvG^6_xmE$f&&(4!>Abl3~LuOF(>w6LO?^mc?O+j+=Q;y*n zi550c^EqCH{$&$`-DVYqe$aDyoGj*G_)1^M%L}Qq*nXnPH|f}}_$YJ5?4gaC!5JO? zax%Z~55E|*sZak@)bTi)cvpA#=x7h=(7LYnGFwm+nIe_BjNR?&%4Y$<)fsHEfs6-+ zE22TaSvySRC&R^9XepcdoDlFN8I^|i&9THT z+mw6N*nVlDs2aH_9D2o6Q7XfQy=+F5kzdC4AiQ2d4{p(`3MhLzkqDdEf#h@@wRb!( z#No^4ayWe;<`ay>V8DHVw_ojdKzG#~_(-^P_mN2{j3|QmSU7%73pl;!zV6TtL*Fc} zrv5R$s3t#uy1V@*%FV$I>zT?RvWl<;wfKQfqaDXFnj>=iHZ--M;h1=5hTHv)aD_tw z>b0j+94r}Jq^{SLKwBJbEE?q6t4kbv&)WTidk1K?x7f1P5l+H{1>ySy`Wei3%ECdb zcFSVf;|H~BOVG4|(->mJzpQ`)b!yC8>0}ti_`%VV>wg;p6_bHDhW_mNEN{DPBC)~TsrHD z{1s>g*yxv2o^F*ee8t+A75W2M16Bz4CQJSXSqDPa0fs~8d8UMU0vy!`H=urx%)Bdp zF+JHw`6$HYR{H%Vn?_CkmJ);LOF~)ss@ksMjeIvH!uK&9s3T_WN$JC0i)6T2rBbB^ zs+i?AUBdJu9HcgO;Ik^Z1^JK-Jgbc_|u7#&`+SlB2&6%uZ>TH7ne{@4(^ui!Dpzx$mtKE zw+tEshAO?9;D5MdVn5GV=mD@u8n=S|0c>ei%e(LP;hmL&0^dbxg`6S2L;C+-pJ4yv z0Uja=e?;Mq0Z9u{k)16HVCrz*3EE`-%4%&g#!8Q2QbdfKW*ElC_lHm4c!z#^uh{~Ce`zGwLlqYSdnnG=s@ zi6XSTP8EHkQ`KyvN)+tqbX?SWC3t>tdv5%tMO^@z8-Z zGaB3RY3DB^q|DrBeIRwfDkb|qGxZYr>x$|dhm>88A>Vnls?aVNfAYM`V>uOOxg_0s zzXc%H5NY6Qan<5NR>y6#3Md|`HST?P?RjOT@uJt^%3!xVaHWUPw%EmCy4AU(<4J#a zy8LD3QZ5aD1T_ca0HeHo@&xwM+yWNYC5g?Nn}i`NQgqD)bB&5uNww0NTfLIz54l&- z9zxlXM$}Cp{Z0;S?Fnoy=a>M+Nqk&oXMM;=(}t86$p6AL_v)Msc(p42mD9$Yp;qD@ z@z_mhjnB<}lD^wbfQ48GWX2s&4U5s)(#3RWLWk&_=VlyU%vM_}uSIfl_bo0vjbWGh z&Tv4Z4fk8OmIet5;ctCXi0__zJWXfoY5Z@`jjaF%`C^5Jy+W%KEm!Yd4>_fZgMoNjL}5fjrA89=GFWbILZ+UG!New^&PmT^igL8Cy$=V z&*pyf=<2Kx^pIGcV@N#zLn6$;YIHx)?0$bQ zNosd@*i7AYXp_-;ru7~;XC}ybzRz|M&CAy!@Wb7uU+agtX>IK3K~MY1&3;3_Tj^Vb zBR|iKv8d$N2a}S=^M(^SFJtyzxjYte@-Ku)A~N;M#D`x-hI{o5$nvYHtPO$L1qdWM zd~sHj){7s_c_)7^+B7k_h#}KHLXcO=gDV3<&TSqaYM zOf2LE$`SU7=$T~wNL}fv#}deFa5|km{T&D5!MnGxrkB3?`JdF4%D5Yb{4_?qlsqTz zYv{WgJ1CXmf+{@XLL!lI=;(b|!v{0Q=oAMD%3V2Asa(k*maG^M!lFg@gA{@)TCpq} z--yVQL_2=GpoJj0I2({tR?%+C}kSQcm%#=bB(Ij zcrr$Kp7zh|;b9nqcKp2Wd4B0ZiH#ITQ&JlN-=sqslPWMmN?#AO*cjuE^<95H?F$}j ze?d4K6T|VY*U}uLC#BEzCl*$0b=*9k@fZQH zj>1eq(-C^pd!#8K_dLU5LfL{$LC<$1AXWvP_B(9i)mjdC znq;|myT2g5-9zO_fE47~J5e=jB!Ee?{Sv!2r&LvJP8*qLKBAoGADH~TUh(m+ah}em zcbq2Y9j63Gx^aR-inY3jaUWPbUx@zLgZtSquYSiqjM3mlcyXuAeM|ef^I-=|Z9ng# zN{o(;l1}*JA$9yj!c$L=s@B)g0QYcl9kzD9@N^^7qg5R0mCNY6eVJVXslJ% zB)%&iAt*&Ua^4fOmP2OIE&dzAIngDXG(D@({h^ZgMgm|v+~MLSYYP2Q7jd^*%Avml zmVT{wr>6Hijw_dIL^GncUnQtaIt5_i61 zuciUv*7ULGcK#xHnJ!8shHCAb_464mzy#{S?=wEa=tw4`3(h_(#!uQd2x^i@K4!o( z@@Gj6WL$&Z!TL&Uvg4NEe=M{rC$@l#H&{8^N@Rc*v8EvQv$1l1&D0`bR!1Y z4xDxavj~hNH9vBdsmx;z0agti^X}M!6)a5eXpLpyYLtXv9k(&N6od4rL0;m#guPiO z8nGOBxr@Ngw7Z4v4v9J4MGIn9uk~6}?eA*?wEcSZiK1chIGkn5>3u1KLDMs=Nc{Y2 z17LR{$DnmzTiH>jixTcH-RiiT{?)tii96}*eD3+cuypSe1+EJT3K7P_awLg6rD(E+ zu9W>QRQ;j>cdxJ)`|2(TDDIy?d7LSQ{G=`>Ho$vi$KufLKxR07RtgZa>8;z^t_K_5 zs;wT-VTJ<4G$mosyeGUmYfsmjB{rcR`QGioVSXnssF!d0o>uT){zTCcI~J!Gtz1M3 z%oo=eKKSpQxt=5k?k)uGRo2azv_2}`na|)dan?^DAMcClM%;ATwwOurUDXId+ZhWp zXRYPwIb}uER7wp+$VSY070BDtLzny^zM+`%BIPcLC9d67C*Ux9l8 zSsrKG=f(lPS`1QF%k*3Yw#1gwIqAX+>%xnd)+%`nMS7>*G6EtQn~c|y%|-GzO?RMyxIuBum6kGCz@bwl$w% zABz(pBVjDCr@P9Faw#(K4jPoK36Ppo7q0SH+E7SYQDf&b-P*3-6*tW+2}t$!hW53* z4mUn?#b4kz#hZkChsQjjwRK7|r9W#iUE0$x<&Xd&X|Rt(y%J9Mk*|)}W&Xsm?)TU~ zzfjxCZ?7OE>&^`)PqjsBJ~idJ|q!^cFlr(G=wP@ zV5{IPD>cBa-`N)GV5^t{SM3eW;65H$@Mc4bGF)yiBBcxWoAJG6%4KOSe+PaRhz-pQ zG!bvr=`o+F^D=%a5X4=j>ociCNI$ty=$JwG0#)mN(v*TlBuF(OAXjy5VYzP+(*lrgT=;(SEAk8fmSmlVj9?qi=U9Y-DbJ z(ON={#a*l+6%eQ>pBgrzq*Rn=|23Ha`{j=riKPLrhfhYc5{oCloY@JXEDGG-gt;Mb zz)X)QSIx1lU#n+JF;8C_&x)Q7`%tXthC9&xj5Uu%WXYyFB(Rg!#&ZxcHIlSjS7W58 zTt`o~q0yaYcw15FamoaN7aZYHwn)n=HFdF8;qu53vPSxZ-IKLmoJ^zzy>~4nv*@zX z)Wip52CR@am(?jCv%=IED(VuM&|#_mJx6w%53-jnU8VV~wQEc>$mm3hv?mN^Oi8y0 zgb6)m6?W_f0Y*=155@=7{lM0Rh#RCQW|;0e(hhleBM$74J*~7>IgnLFpM6SZmRonO zCnG=4zPl7C^@xFYNi|DXujO)(Dfq^zneKwmK78dQ|D`8>T+Jv%+{?Z7<3bbV7Ov;F z%cIu$G0fVJ*LSieUg)(Q-H_I~?`z(6Y({1(Bg`e0KY^U)nUTq)`%(*pG63MQNtM98 z^HWWyQ%2$&QR2-_%j-G1J(Rh59IeA{@#@BL(V zA{r=Os_pRM?*0^|>B#1qr+9ZIhs&Nl^LUl^|Xz)5C-uL2`+M1IomNuIRetSU=${#T}JHP)-ox5UcXRbiY zHtNm$zh^3)6{r<11O);r036DL@~@0>)=pOXM)rVQrGN4O&8taTuhJu}V;@4N%d`sw=Y7>o%IULbTNh&G$YzVa6>+TG z{M4hD=3& z#s^nPRvJ;fF@VK!?TK$gFW53FRuObW-ZEIudh1tHx?7R zm2xnm)re})s)7SE91JI}zYkk^=XXQ&rj*7mge*fqdM$_&91g^=NZO!gqtXQJ`B4t< z9!0;RsCUKgwVArSm4+B4x`EW_rchk|X7*I@33KeUis=K#D>Vsa^&5}n7hYqQZY`Z# zPq{qk@^$UWLez98tLohuUQdG!B%qi}3VM$^x4MKlK=?T)lDp&~qgH%(Zq0G;Hx^(~ z6VOhRr+Df7{ewQ*FZNK=BuP&2;u>Q%*d){em&=oUA}KRfFYX|HAIQ;y4T{^6@yV3$ zljxPE%W+um2W320FfGB@2sjl+GW$0;`NqQddCJBGl>Q|eK|jd1eA{NI*8Z1b_QqmY zqqCZ9nXd2d1ix=d)b#=@mTi$DOjOT@DIwWoD~1xEBx;)Iak9)}L9wij zX+)X~A)HJj{h4NX)az%^niB++3KbXC3~C%2(H4;#=%>ola|@goYzrFEyqu7qs@+I* zx=9CyRn{_;H5-QhH5lGl@S12-7V3OvPlWNCRf5^F&p)qv?O?ColeTmK+u(=SQ3LtI zK_Cv%rl!94wt$*iXPZt{+`oJT6Otcp;zzBTCyhed@nP$XaJ>S4FyR zt6EV#)Pmrw9F|=GrL7jT{mk^qjf}c*ww3jx+^TASYH3~b?a%bYHe%b_xUd3AdSFqu zcUVl-Xw2yzZ=beUuW6+6`8BH2+;z!s?9#b5&a>`~Y5f86-xswnH_<&1U{S9Dl12V| zQ5)M>J1XhvTmE&dQ@hHv^$I;)$k|)zXk}+OSWnP?zgcT7lwhK0A!i>L$|s38 z_*SIl=#WY9b!hf0vO%0Af2*lDOAEXA`-$ars+hbv;sfmZwmRncNX^kx$AobLswXup zrLH{*I@wq5veL=W7kauV#$i~68st&+<~zX%*(u7%6|(RQDK(MJAbm=!<4?v8 z)=umzi3y8v=r%%;ICg+cXgY#zBefZ4m|xOpxn7cz_0W=s#H2y|K1kZr3J`3Pv4w54 z1M5V(AlXZoT89(@g53M31t^-vd19Jg4+tQa#^eoG=ZhH-FbPVeda5p9dvP1S8j z7aAK5rj@|g7okiVkhcc(b4lyhYlv3-GPkpMOp!6X5YeQ0@~>GJv=xE9%g0G?FHb8V z5+EXaAS5MK8l+)yd?Z6{3CztdJt;E7tmIYtC4Jy?7C61Qf^RM0p!BX}aLAT02>#nV zQ`19oizL$x{Z?=DB)+|5g8H5p!E`g3?$RMJ=^6su1=Ak^N5HbT8fXG*kl%$=h(t*B z;_3Z3(eC`r&c8i;=|dud3XYo0LG#fAie)!@Y=p9F2}cTocNN5>fJ0@TXFlH9oTO`Y zvV&1;3!pvIgnLz4KnPM{6x-!rafcJUf@{GVYSvf69<|&Og8Q&FU)CLC-uGS?t|ir5t?l3Zey9oz~w^cpM4CkUVa#FtF3k;})4_C^st64+!g~ak^(}A=wuqfkjyq0YmWNtB zqUQ(U|A+jlRz`+qdjBK8Y8%cIW9wI7pbEhC@BFHN|D&0eo{13yt*x~Q5RlKOcc`3< zC_D_#pL3|-#l?gafPg^Nfq;P9p#WLIfet0xq5waD9TY?bfGQ{Ojsd@bnea>V0|8Y> z!@lYLIj0KRR!rRi2neC~&jmbaQ(_1N^jRn_#INM4eU=I7f!2>XNSLRD9D|T68BeSA zGdU0KIAE$!%!VY)hZ(#ee1`arq#X(>Y{nhZEH_{(JqK++`}1StJYd`|d2K_>-evgp zpf-Da;^J(4m66M4W6a%7fMp0`GK*)|>Fw#-%?d(x|NXQIkO*`^)8=}GnxvLP$k-ud z>;Nfs{0n2cpdoAUkR?LwGWXvFLXBfp#}@oZV1IwQ;X~rSLirK>_1O{;8b8A@-_b|Kw1kSSN~T5l(kR-^}nCSMk0~)_oD!JT;#8k|9(wmpWDlwS;>bt z`^W1guXg9h%V`^{fAP)7`{QQDWUAN%-@odKM^fwd?* zSih)^(;P9lyb9y)&L zBWX3`NG%Eo9CiB#-|Y=6{=B)P;BkM6Sd_i)bpG+?dQHyn2bLhGxkDB*dFpz-ky9YP zndeetQaqN*sPL^5PD6wH{S5ib0cs0_@x>3y2HJzMH3 zY}?~`aM5WLQeZHt`Hp9brlVa$*G&Ft-2ZHKMyz@QH7KC@`f+1y)*A&n4OYeL?vJz8 zyJReZC!EE_5~+SShoh2S*fSQA5F3+G%OQX=PTPva>4VRDHQ`xI7b%=X!t|NC^B2P$!=}I2=%0UKVVHMQhrWYXYDTW0e+}z@W**>GbnEU=0@T|NnXSy%ucb=WFQRjmifo)N+a&c? z`?9Ah)VZ0R)_IqM(M3g(-=kE(VGYOQQgPTyL{SGk1idZShxYlK?#w^eNXwL~kZH6V{Ah$=4<~Z0a8(tv3A89=FEU3%jU~u9S&%62H;O-5ALas z()IjZH{uzz{n`9(ax=*3Mj~$n5r#mUvv}Mq2`T@=Of5=leq%bmiua<{!bqh4fW2q&kDcJ?exFJ_nUd zb~Yte(CnsZI^nCsH_s{?P!6KWDSn-)?86Dgb&>JorO@~n?SH--4-h(iVmY>RWve0D z(YVPfbeeqkCvyvrebi|z)_lA)Fa>O=WJNzC-_)zo{%$IFIH1QOb~T2a9&l0^g<&+% z*qH{@s?K7$R1sdx?1%;zPv(9#viJQhajxk9v@6W}^F6uc?o2Y8@KbuWSZWH5W;4Ux zC~0pvZkkzoqt)e7KA4v0ne!j{mqk1Q*pz1l@g+!<_3Guc>UIS#Yb2b=U;+$F5wHZW zL{b|qUn5`Ov4nIUE(L#qrk$2n-rgN6;;>oc&6g?$V^FK{@qWJ5b{u{^o+->1kN+mW zP@#U01`CNuP=HRQGS%e^NKh5Wmnsgc9u|H@caTo&1RLXLS2ijiGp#FE!ZDJU8 zyQt$GXnvGV7m7-TQ0jR43EXgA=#Cx6Ut8 z>8z1qXcT!i9EfYps-M3*oIT^F-qaQE=Tcm<@hOV$?HX>_e^wp|8DgaJ3+>l^pHLwX zokY(J86#l|DalwETprmyYR*HARX2oK*pJA6H>mBKTJm8^D=WScu=NSwf&;X$P5J;J zG2%Om4B_#nqBWk`<`vg_Pv*LOpZwVyD|5vd-yLg;FlZ zCu@iObm3P%v)PPXFarLPf{}$hOh&8RP5CMD-!njn?$4|V+S;wd2v2V3|Gq0*6-{J9G;_-a* z6X6l)IiA!lzET^0LGkYy9B>3smBa(Ky93fUqcPf>_K3gr`S}?UfC1f3quG$7#9}(- zlSHR8@hLd1K(yHxiu$ak*$cK!1Uf`|~_Vx-E(_q4go|t7Hv|a;KLk0YQkP4c~B8W$@ns1gZUxjKM-eE#v!W zVbq+vneSQ*;Ua(k(7(DBQ@%!@9guOo z_!iUO^wg$vcC7jKs1-WiY>Ca_D7?G3ME28nF8>nfWT_tWx$&6Kip#lB*8OhZ@odnJ zo!~i!@UZ*2E%m`lV`hHKqRw`hk*D9YE785tdfoJDtGf#BvUlwl0Ai#C1Csz%v;4L% zZB|c--#^4;5qwUf*6F_4{f|tNDG36gCVfd}<1ZbwOc~$tIDTdz;B!bE()}nHRjpJQ zy2rii{Ctm&1_nHk^Q%;h4+^Q2uDS*6!u8Hz{^4ZSEUGlNk3iQcS<*c~9u^-i)ZHv< z=ieRAC>%&(Q&=R8-Dz+8DYcm*OC&F3#0QqNOn!d6(y`pwNPB1T$cBTO)CiL`*gm|0 zn@`n!-5-n1#2C-yw`sc$>KJ^?wlV=|=zF8_^<9N53qlB+{_NE`R@Yc%Si zo^#oT$YgVrQz$KR@Fu?-pp;9MzAH>R%e!S)1^y`h8Tn2T_0Z@wuON}y)7~B09{Y+& zAlELEHkO9c=CPfj3c~ohQVU;z!uEd!ZC#j#L50SHl{|nEve!0v(q3UMEtTsAQ95{! zQ>qiw8;M_WY}0aon91!GUAD)d)8?j?tQ~-NwW=#2&wKe!$YmFo7-gwm zJ9S5aN-lXI^^%n`n94gTe|XWpY!6+?=rV!#l9l|_Q)?Bev~z&`e|A`&rg3Wg{+BL& zX6K&A{|PkmgAwz--CN8)?usf7>tD)GUaa@%(_v$>8_PKaZe;-9`df0Cr7)YJw4yaa zxQRyL4GTg?-iG6N{KyuG#1rB2S{L}_ZW8uvb=vuZB*;d>?Ww|59p#C1v{l$Y+^_vk zm@Q?fRI6qI+Be72dyUzL;PajB*ALFkBENr310g!QI*3|n$)vPke-3WrYo(3O`k-$& z9QnB*HVMxg@2|`*ANm?~jvVa-k4|M8%_Q^Xis@nK6l1sfKnZzTtO6%seJxkB;r;2Uk`uuf z4wfomS0p;bRy%|3`)VvQ>gM6l|6&n&h#xEhBwYR{E`dSI{ipe=b_?5<6vwYgM(fAd8Pfm;mPqW=c1P|>K3v_{g|Y*Ko_go}+vlbp3e1-CV-^})wenS#+N z)CyuSkmcHNm`(Xclj(|Q3MFUDl*^Bw|$5C1oWn=MpyPvhE!RQVmT*n@Lwkxze6oqPe$t|)W5 zi#G6&B?JHkJt>3#tu>Dj8Gm#*i~)iB@rDl*K!3~Vjs0USEeujbxSbWcgH9yOzOV-} zM7KNIbfwyB5ElQR4;LM!aHxTE4Ig{FiN;c0C!?B@!#z7UXDqGN=YUQ_f06Pi za;XO9h0RLJN`uwAzdMkpZ69#|m{jEqu3 zF4b(LrD9iWuwIuS^tb}9QpS0piXz~V_@jVQ?xA5YQUIEdaJ5XC>cjhRBGam8dzqQ0IKB&&H$+=#_=e=a!Q3tt3{iT{ypkWyjPGx^lWhYH z_fy@hRx48gb>EA|;I2YuvG7ZCuot{sxqM(`@sCzaVBg&tdfsxnDi-!l*c)eC1|>op zJp!Y>X!Tt2^;)kBGJd0vZD*LsV9GXMw2>;LQaSV)3s3s!o8Zbrbv6G{$O3CWcT9gjG$4N%5O={_8!d?Nsmgz zPsauJPfp76_Hb;G5WxH>Qz~7uPvmibpbwnb*csxkT5GnS0%!`34wYi-b{?e-a9$x1+Qcn(7EYGX$L8Y1>=;oWvTz~K{6?eM#vPiK^_V$wAgpbEi z^zD`hJKcm%nTK+jLM<))(}@M=&oi*Xd9>1PwV*>85wBT2MIv*;cFP!^s;8PuRz zlx#s8fAp})q*hLUnx8U}x3;HjUx}MSCZ|�NKcgW6-eU-`3J2O1>i&W7V2W9&jlA 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%0DbT|Q-;3b7=(?@#}e(=XCcw2Nn))8 zcAwBKoP2yDO0=}Jr+6VU8jCfdzsuJ7|F!=6%i3y^Sd9-5e}_0$f20XlNtplhZ&oi7 zdti23N}P=|Xzx{WxXodv(2GBQi2PaLMqVdd!!|#7-6ef=B%)>5zwZ~Zf^{X(8~bTs zmvSzp>?qtAMGsuXY@5Fs)qPE(yWBYV5o0TI3JE#J33z4H9FMm(b7hhGhB1?4{7|<* z&!TQ^Px}9H_ZDDLc3s=>HKYQ9N=T0i3X&oq&45a)gn*QwAkrYHl)@k=NK1(#9fG8^ zfH(#vNH<7HOLxr7HUA#G!{>SLC*JpY|L-`y4;{E__ugxr>s)JJBajc;{EPAOm#}}? z{Sc&JOZ@F4VRDhG{$%sopI5g2G~)j>A;u!7Z*+6W-O8q*qjiB8q8)4Wf`eb4)XQ2> zJyw3=@jw`Zi?Ny#!PRQy{IMTTUv23qsQmbGu^UBMzT{zW<>asf1s$t<%HjQ2uH1>b zwDYVqrX>Mob>+R~f?C4PU@adoG&9YsfuUKQ-qJB37CC?$jC6{-6gW~&cEz~tb<{nk z$qE~pE5loYV>TDnO{TSi1o?MfrQH3p_01?!)%5$8;72j%eyt9-Z|y~aKjL{N?~hRF zdwM#@Gg%qzYMQspEveo6r~FUF-;ol;`9&GBgFcyeO3`@#i%)?6`UfPNM#JeJ-}E4; z7kr3ci09_ya#PsB@}|uVVH<}VR+f@Nwzn;<5WRZ5*@QmAD0EO=Sxp&2fcLy3z(0sE z2%U!x?5Cop+IN7Oikg=803H2NM*72t>3P^Wj~o>`C30Hml%Rm9w7R_LS!D?UL4~V| z$`>!|T+ulrZ*;>*>$$l?D%#9)w5`q@*Ndq~zpeWZb& zNuR%Y(NnlW9RCLU<*yk_e zQq$5iUS(#z&Mqo0DJ?61TT%Jxb4_hseZ!Z=j?S*`p5DIxfwAx76O&WZGqXQdR@c@y zHn+BSc8TpmK%_sL1%Cf!yAFYNk&uy*l2H=dg&=VwHvAA7`7sfS!;0FJH=OB@pLw{C z;ao&Y;m7@4qB_fr<}U42Ox$8)Csv3}+iTgs*D&AzQOo{l*q`khfM`e&VDLx}K`3bb z2XCqm)&J9!=_-LF)_N1=eL+@-B6Cg}80jg=Ec+8kI^@9MdEm#pC z^h*L1nAY4)fTjmpVFDyUfan!i8T8R$a}v~AnuLd);FIAJS3$e&P*~gu?h<6JZ3sIS zfO_U_kqa)&BgaT|r8DNeAMLl1g7FC33WuOuJfh@T z%p3CSh}S=>8@$PH*X**kpp{#7Jlt_C-pbW^M~k9GB`b}qOOI~;k}&+>1_63+4cByl z-mF7nr+kDbJcG{2DQW$ADg4jpNZ@~!l%Lw5qh$MTPT-A_FsVZ>xoKpqLuQro(NKxD z62$Nyd>9il2~a)!ngE$m6QI<{5<3}90u+wF0>3{(fRs)^=PEyWgt3T}F3a^&Qm#>? zU%N%2dpFFSog|%iTE>e24KUsv{Pck$kd{JB`MK>m!*= z)e{#YVNb?~%Xd+xkh6`BwXrK0atd=Da-fwhv4T%Yk7wA`(>N2L93`{lY%K!R@Y#a^ znYIz2867RMBSvu=`&C1~9ll2^_a!q-i5&iM3;|{gR`Z_X@!Y^lV zCsL)fuWr9XGH1eln9(aWv};MvVaP?g^T88E^TMNo@wl}3Hj2BIp8^l6(BIqfqj8R> zeX*3(_$v5{ujbn#&gv@K%#Gdd&onAhp;F8!!K38?B^teQlx9XydSz|l#~L5@4YRt8 zfGfT>7o2mR30#e-2g9gmuxeh%B*s4dn6o66w|6ns_wt<}sJVOE*z5e|h-b=(^zUK< z-edE8DxiB+SDlVPqJMM{J_C$L7S8|-&ao~PzaG2x0MN*}-)!OmbW&_53vp&jnqBVx!CZF#Ff8oiq zc_Db&P3=&_$0k}O=n88MC6#t?3?;Q+Uy_-veO!$l+k7alR+0*5g$uJCw)c?9tAERX zneGiwOft$b9G4IQnopF~d``NrMvt8(#Xq8#O%{vC_@)6Ot> zaq+9~gJa*6_cu)W@W0Ps)|zE2;vhgM<{ib>2b-@F^acA=ho0YKryb>lzvoWXCpzrN zuAb5`j8t=1lk-4MmqLQ2jn^nvKOe|E5YYzqlAR+!Ppt`1ei3@+R_=w(_EXdX?%ahZ z0=VP5y~w67>PT_gC+)HTu|rg{&0XjTo(yy^5U1@9MtUz_9~2kl=YfqeaIh_Ow>O-z zlZ(&8R+rObr}$#H{^PAPX&%-ugKyqz5$VZ~c~s$2xKt6|Cbgoe5mQ6kD+fbUZ-(xyPF|0nD`nw!AtVU z6U0!~UAX^3cXZ8H8Kv11i#6q5d)GH~@ghSOl<2AV{b@`cJ^M<%cS+)<@=FmGog_Y| z5-t>rJVv<&sSSO!XTN^M%&=Tv+ppnUJqLy8PWL!R;q}_%4KueTGgkAO9Q&EPZu63) z{%~etJln8el8bcm3uKk#-EF2{rNN;-Fg6~k@aD^E>LO1}POF3M0vn^^BzqP!#OjOQ zp&dZ?vY_JH$a!TIUg@bVw6;i`Do0B`gxlD|yY!Y8a-4R?-3XA+63lq-c$i%6A>G6( zWl>Gs3@Hk0J_5U&qDMsu(Bt#3E|;^`u4SvHH9axEz=sYl%yVif&O=Ygpb3!4cLLO( zg+P_KT24ViCPJO9jf3}hJMwdAhvvgbrBkEAToAKKo^Kt-j@3sYTbmxFCFSw-rvUYG z>Lb~Mv{FbHZa=+}#!;89HzDTzCI&o==nD(?W;-EbcWPrdiEe-er|> zH0V&sg)|O%?Rr}%El2g_GQK7#-6>d7?zY_}@0neF*UGcjZZhs9((R`I3j+Sxz`eeA ziQjv0=XkEq`$K)l&TX`o+G;DXU~YD!W_XjfsZe#{MYc)n44OD{DRUVDRAP%~fGmPq-xtN*e_~ZuvC182c;}7e(ed&z zBL-r*_x>!mvf$TpgFQB}GPmNcX{%B`X8J6ksUS6{Cni&^p<6n8Z4I~3QkqN6 z);e8sVCbk>&A+JPvP(K=SjkwTX<_4Xbt@}Br8va5-fvEU9v`bqfRa9kK?>{1x8e{*wW5&DZnZGFa!FQ&B)rA9Y7;jaePAz zh$~p(%b+S=dpV_HMZrlDwHbC5Gp0Y2OqJ9h=ZYHt)C=PZwslvO*tMU0S5o322|;Y@ zMg!CYkdr~&M!H1jY)>!MMNJt;#1mQN`mCw4ISFkbv|a&#cx?pea4??<&?60HFuz67 zBU_-&sIf!snCXy_Ej++d<<`kG!rK>0z`~ON=jfF*_>dqQ><$nj;OOmKgP>3UCHdk1 zZgQ1hO1I1px6GJ(!zO0Ab}Y(uTClC)b-r&gfFVy8lJL&4J9&_GyNV|-l=~%D=+b=o z*|DX+vXDUIr zyrPK1o{b*mB@X)+FzkA$Wd<;FL6%2Y9aHX*eiVB3N`m>QG330_Y!?=-tw7H3|KsP@ zHX2swAwbK*_52?e`L;PGHcvGibSB_04nY6f7ia!?Cg(}|h(Lyztu*0wl`@Oas(*8$~E%0zMF|0tzs*TVY^Z zftmdgv$O^vH)P#&mjJDD6a%$+h5(8GQhE~3W^-3BA$QpR;6fC++mTzN_)C!K(jKfP zS_1zEKZfs-V9E(%Z~*t76VLdYQ!zxwzf~2TckhkWxI#XIZ4R!v>ifqFu4toez5v+N zM1Zhk=si1SWI+lw!vfUO1L5s-~@n}}YXupu)H91U6hqi^f zQj5_gz>rJ6wlskm*T82=;7OLyOF+!9LhY%=nBVTwF16 zbi-^lf|eZrk*>*b$Izs9>V2&hbqGuWthw~;PLtfL+QthfCiN}rv693*OO>?3R>vaG z4cwj4y?N^1&inZG&8mXp7pUT?VKz?FjW3)PExaUnM#aTNeTJttYodimlkYXcZ&Nj@ zqWgG{mBx#`f$Ucue(K4QGt2i#l)dlWOjnv~Jp zk3H(SQA_7>`!x&egN`FC*IATXEus{T%w%i2-9D+yBzh*^^0N?y=hlM8W=?p?j@gaa zrWVPBmsryvp)HfB!1BZr9#B@XrF6JiPqZTroZH7!!v+zaJ z^RU(CgW+5A9`|Dh0N)DOnIIgO5*5x#mcDm&^uju$T|6CYc42p!0m1DolotjC3$NOqqr29_$5Ar6;57G zfF7b}luL3rdoOkgrXEs!U3Xl^)xV4^Bz|LPNr8<)->P5SX_u-N;Ds~-6qGh!S&kFLGQSa}Nig|C{|C!d0BfKZa<7&j5E5+iJlz;#2!@wB5A6Ma#spM(U zsQK0Z40I)in{&KNi%c`mpq@=CRz}@lkL;-$>B>ZqMxJ8}orsQJq-wujl#Fv!SZ0t- z+d}KhwJ+G#>MgH3vp*2YGp;QiB9U6x{6yGXRHZ00Ajvsb^XYl))}hY__e0ant#{T_ z?p5hO>);-Oqcfr-LTLM2^R!OeM3^?e_jsl{BJefGw{N7rsW-m+V~P<;`jHdPB~L4~ z_H(g2e@Whdx!9`WT-Di`0fj*}8@(TQf}ROp?y%93yhYR6c4rBuNQP_5`{^~I=9c%AjImS0{I9o;O^4yv;_PGSWx!}(6J#IxB{S&BK?^E z5!J!?BHe19-l1-(Uow0-hPolDHIX~CQL-lRd z%ejxPC7(N%N6S6&s9?8C!M8-z?uMh!nV$Rg5u!}BYY_Tr;%WCSnA2vrU>LAg1tqXD z;9B&tJ*bV%qz0f*wGuC|mZsl2eJ$;20K9m1!du+?jhW$v%JZ`3s8cr&zh=4qA-|38 zJ(?97PE9HE;C{%eyE^1^LNwuhxA;Hl7u^l&j}Dod_m~Z3(*-Epxm}Z~qxCr^H&ZOB zzPJd)aC{=IXxYCpp0WS6X{FzkO;bV*Ma08nYGmUal46JorRxO9W{B8-CH9nFnA^X9{san5x_weH<@)#3TvAZ$KM*vOb9JJPeo!D#kY zn6Sj9rj)0rW6BoTtt4L=HM`kOV+Kl!PB_UWs?Lmk5HxwuBLxk=Jb$qL8^p!wFinj0~*8d4- zW;vo-I4AAlN+lwEWu9+q0LY~2cV=6C*%D8c!^S09n&Q3}YF*h>rr9_{XEq2+-EN_RnN{$6DkX zfvHiZouAZ09#mAGMh)fJ*1s<)_s3qcb{JC@eX5=eA`bhKNrHIyJ~Sf>)uN^IDzkBB z3waVSnhS3uiy}ZrWrTMp_|<(xF=ZtqJGk(TG_2hvV4*Y+Afxuwe{ng)>yD9lQa)hW z4lltKaqlsAy?7DUsX-9$Klt#!>{#z#6wn{FEsyZ{x~NUHKvu}ZepStI_$N+l$EdLg8~>*=Yjq?KtD{*Ke6wheNX zq6jQZNm{O+fr|K48Uk1vO4$c{Mzf1=pxeGnF0L++VGQhx( zY?Tn8FSF?HZukY%s%Ho2=iiS}|G~8>@ncy9gWmOurF9ZqU9x4m-3 z!eG4+Hypkl?`Z%#DKOk>KN{A@)%4_($N33T-w&_{NpkSzPRE6dBBpii4Z1YElzf*@ z%U9%-KO3n1%BgREb&7`8WR=!V{s2JW|;bYzh7GR{SH_1(m~oYFxjZfBSzA6+xj(FE^$qP{!h2Zgb-GbAOR?9P@J2{BYf zjP=a+ky7&OLXTNB*h58Sl*d-DMk-KIc0SzEi=RUdfr^KKKSj7r+@`87O7qmd6pq z{=WTfm@0c4Io);w`o1PEG5oi`C65^pVDi!zEZGpCsP;dOh`h@`ydLU=?LlqIZRFsA!5 zryc~=1}|U+Hwlmf7KOXtRNgp*pJ=(Wt>0}qq`@w|kfU)t>+EVsF(kjLhbij^4wNqB z*0L6P9AEjMJrIsR=&;+oScfDW9*8P5Ib@ic<5kuQdnW_i&^P>_CBS{$OQ7BJZV7c6 zD-k<|PhMCPEnk$#&;ZTH>;kMezQMRrBWh-odMedLX#c0Ts1Mx*fCE^O*#H1)Wfv@p zIlvu^Z=@+fR_L0gUeKXM^Wi~&Y?`FU2hTs;7EDyZN=~ok#|1%kon)Dxo_a{F$v3Z# z=R03kyGIrgF)rx;sqEY02hIf1R&ila;smKBAQ2y1Pu$m{INzG}u+W0?#7B$xu*)J3 zXZhapTBi^9L1{Zr_p}$ROA0^;ceLS40lp zP^de5G&_-PTSYR@KIjY>9;4RH1FZ!yEy^hM4i0jy-Y0Nv6%Yfr3c~(5-^ZAcjBa2W zoEh0Yl*iiAhMJ&uSa-tj1K{EBthj@w==yj9w9$--QA$TQur|Tf;{YftX#j@@=N$sn zdluGXiU1PcPIz}K9LP)tgbPs@6yHtS*bT>fmBYTJ8HSabyLc7&{UEq+1iWKGywLx` zhlC|>VVbMeSL*EgaPs(C?t+F!k-G)8lO5;Dkcng#L;#1(dY)&>>-0-x<~B68JWu>W zCIXm|fyw((#RBN*#z7b_yseFYLDakYBU`iRPk?1(FUz*iE3HyGXe6M0X!>L~d3i!w zxJ5J2!ngX+tuf{JU9;uv*tVM8miRg`?w$A;%56J+AHH92r(w^2h9Bf%mVnFdu~DiI zztRmGddi>y2Iuw|=yv_z+bhOgVW?_+&3F2?F*Ao(t;jv47|h-0R8@UyACIorPb(bu zdcOugyo%gfLDfCA)d_xb<85IaQmQOR^c2fSx$shHLG@Glj}9r%yC_OAGb4>IX~HP6 zk=;LU*`WIRCn%|l8d+Cn> z6TKjYXqV<2dgM89;mdynOqJrxaO@f|!Rhy$0e!+?*hHNHZUyl4 zyET@a0O2VdQA=OVaF_O2|LYhc46DcQ1QR0&=0U=B7J$q!BIp(I4A3aNF9Cx6B#>KE z!XSd+jTw+cx5i-{fXX#Q)%I-HVg5f_+i=3Xeyy{#n67`xCgxm+_*I7S- z>c1hU4$DmvpxXq952}At7&on1{x(YY{b4oMDu)Q?NYoJciVx5@ z#cL`s4F1yVSYuYn0dC9Rk9%yIOfxbc3mTRW=06&=DKHIt0(1m_7Kj%BRsU`W)aJ)` zMRs<1^5;F=BzCpfEN`m}Il42xZOoOwe&E(zWcu+&LpIwJjUa;9?g|*w^;RN?PNqg% zJ-QosTA7Z4IfZ@4=3~ok>D_KkfWV2s+ZrD1L`|>qLC=~O7A=Gsu9G{w%a_(2u?o2D zbn1*WM>SuZ?ZCzJ_HL(-uA81h6M;FNm}fAVdcQ#z`}9$_Y|l)b_bg^(8NE*N8({AP zfIaVymz_tJ%@>C=jZGrvN8a>(YoqA?JGJp&=x*(2#%meh_*&r7S;*@WTe!H)?G+(gm{T|G5vh$IvZ?qoYCXVKAuE= z$N$~vr{)fH?+;+HkL*$b%6=9#w}ITnI^oHQp(Vcv;IyPaCSK$($52ixSl>)d@LQf$ zM$fF7UuPRpaFcylPak+6{eu_rmeX%F9}AfJI;PO z`GA0MGA@hwK=Hd!3)uH;(l*5i&LzBf4!M2^NYM{x0VIk>q&;3o#;~cF=)3iAgzxSf zK##JaR~lu1NwG&&aT$PK56y%To41sADQDLOMX!UBt-E<9sLjg~Z($^?D zPDo1PJhjMk3bxl?!WHGKSz<{$WQOS8eMHmg$`HCfeS`>O&I3EC;W+3y6;Rb6sJyHn4|nZ z%7$yX0LVPkNkPf#ezwVLR2Lt2GWKHh}U6oJ$#{B7)Ar?^nLbb4g4L}wbxt}o>X9ws2s}v zT-mbQoo?z{HF|oz)z(j=Td?$+Nt5Gcok6?TKk}+FQ}Se*YE_vw74^K!asR~A@8YF4(zP20z1?cB=k`_jBspk@y6)<~yDpaJWsmXHk_Sda{OT#o zBH#1JA~Zab+#MxlEiyY^ia(-1Tys#3QcBiE+LMzPc>D7nd`P@5b*-QDVdutlrjc3s z03WV1Yp!ee9(*^czb9#}wT$wsSHVns~Zo}&e ziZRNx?M7~9D|5m`>OoJ;-2$#JJSiqs9=@%zr349Ywg4@r$Zv+-EkWDQnynu$1>!R2 zs_b*jbR>G@c=$=-or$EahGZ)ApfnKFdFZ7d?fB9RP;2F07!InK0Lo4_3f^Jx5J9(c zgE^oC-5CBcaDQZWzPxPywJ6hZ1=n!F090Tea-o_Z_GKE`TGlJ1u}HT?Av7k1w~nkP z)5w|Wb!LPOTCN``n>s6b+nu5SU>cjG^@Bi%V0_bhEHwFgCy^@~NGH#ZzN8`K-s}Uq z;TRA>XmaGB(N#Q|AZBSaXOJG7wwm6L+)|lTU;wmK!R|g|ppQSQZ1w;@lp-}6yUn-t zjFj#01!}u0>fc?}v+LM`k838p4@Ye4c5xeW3 zWwgn=w=!mqIT5+O>b*Qv_R9Qi&HQ!;1#;aXKz=ZIdD>oOz^Vyv^x*|f2XUx)O8kb( z<}fG>)rKC?yKhdc?$0OqjcxU>>O9ZOH;?)7MbAE7ud+E*VTIv2gibBc+zPe%@A*mp z7sX2&z(!A}GS-1qQ4~Mt`)Jv%(pbRguSAS?iciD?o?ukTU2C{+MQGgPcIE0QnUh2})B($U1_Oe|NN<52Krx}VCJE4X_E|gR+HgIL18ADj zNKA`Dd?+#RZefmzVOE&lQ*$OjvUFPz6Ufb@mx$Dd9+B~|??FvhhvRqAFkfg~J#Gu! z$7llIntmt)LQ|vSeziPX;JJVZmye!Sk~uLy`2&0>uG#u8br^*Ux}jbe?^yspvQsXO zf|aGvbKU55E+esj%g)eoG}GSc=%EPCnC-MKi)^)UT$NS-+RV%y1$=>nv0dJGi4Szs z&CBuch0Dxn6GNQaF`VRFD5{R zVoAFc!1f%;$mYSKRD0B@4`j=g4=L4+SGC;}LtvD&19Xbt>gbFqn!U?+J%d;L$cP$P zz)XKfV&}EUHrPR5F9~A0xOi6ZG1#M z&6>wdNWJzt4g}~WwKTfz$e*hD*R@0R*z0x)g(gIoBiy3vj>x$<<8A3meqh$=f&qaD zrbpJE1M+eXu#2}bOTHa{r@^~P0)hhb*oZr-0 z+w&O;jfXVIAR0)9<{mKQTZN`I7hbPcdmC)Gj;Z&o=8tSATzV$SY_NkrbvcxFq0W$& z?&5g(`LNPsofboE+##<{Lm%e+64BDoW<&gkI#RtjkEl=!qV$`S{;TtmQB#LrY@gtlk*Qa=omUrG@S<1w z{9m)g?dwu~UFQB$z`6Zn{kQ^?BY@&PPDCmur5%uq)E2*UF|R5C7o&zDQZatY#8{Mo z->H}?BC%lj8CI46kW&fFq-N_LV8up+0^+6}y)LT2IMF54F_9S&O>^bgWwjQxASO@x zk~&&&)A(jGje4Qu_``ahxZYHsGw4!F;4taSf+E>^JHu@0vrQzPH&H!rcTK2pdcH2T zzF>TlPW`5~%HjFYb75~u84!x%`wgS)A(GL<2FtWwl`Ea!^n$6&s{ER*<75*NIR+WY zGz+9)u8%AxO#vBELbpRQh^|Dx$Yb5}?6g#Lo$y~a`e=2c=CSPO(ryKo`a271n+qzi zPbYe08%XJg1c-|th)sZxW^R>akxDEKgyRvwOvJ1J5*z8*g`PP;3`7gZ5iRUytSgYZ z3O1M}9C}=3uoSsVdI?~HaiB7Yu8|`;Z?P9oo6L56IBA|eb>YU-{qtTqmy1i0JNs-f zKY@HGWW|FEaRDV}gA#$$RSGp>5erveC5HW^{lV(}7u)w&+xSkKarKB_-m!4m+9N|P zxA*bvTs?32o)e6S_hyw5uCgg5NXXnj&^bIc4bM?mF8RidW`F&4-k~ zz$q2=vnM$Y-b5dDrKa19B#d^n> z4t@RD&5?EgcWcfVd*fw!?Y5N`&223T%e?n_Bu)OVHkO7a`%W?}5mX`@7uS8u;7v$8SNx%l4O#MkGrmj}hG>f-Wuy%APA>c)%8 zI_FOfbsg#`%aH`?tp+vM3uw_~5<%9F`>h^ZMO3~U|7x)v7mF1JYUQ`!#H+jjE%tk& zaoa{f76RZ!MH`!$SjMy$0GY3?K%=Xxm7St{8)BzQu>=nMW{ue+u&jCVpO8@~33 z`jFai)H?iy7n$+AuIlhG>a3=~{_jV}rH<86j&~GvAJA;Vig|m_d#qSEZIy?3vm{eX zpjT!kh?rf=dSsRC&F}8QD?`A@`)TwlrlA`SfBp?`K-Y*ScJBS)=L_!?nvXtREQRdP zjnsJYn-`;}EYQ2_W_X%5QcP(cW;&r2zYPc!tmz=^@ePcSKNz7luv!SvuXl|Gv9ZXl zG0dkD-eejAv|#77`1`}O1&#%UwqZ5OzuYIm6_{Kz)3q;yvTzzFvjr%v{qMA<-b&; zBX%NeP><3j0%z4zW+#SjXaE{-3IL)!J}C3Pt03pW2E&`?EX7+2EX@jWxynN~`zE64 zN@zCfSvJ4%VN)?9T74~NM760kv?Dg%{jb{WP-<#sGC;7{Oa5<$@t&&krXs7%+=><;9uBGc*t1xSGn!>w0PcYvF@zV5L}9$ z46Hb@D&jxzj?Pr%>I|vedXvp@)$o^PvI{l2(%9)Z!@Es3WiQAu#~(At1dz^vNNL2y z+0DA?1<9zdE$E)JD1q-0Vp!{G(d4N6R#GufrUxZ+O0+0$#(7njW;7{HfqgAfL;Re6 za?M)pVogF=^r`kmD--;%2+lbT|sLl?-^GXd?;aG69}JmE~4DqLw)|my^k`oB&8E-T--m z?<_i*bmK&BXR};=k^t6C;u-y72yJxhLXNO;IF2$32W-2djklow9;i<~2S9*sFLD`) z-=`mQ!!|CodN}FCJCd<0#0*AAvuZufGujdqzhTnrL%S05EV=gYI{m!*$Pp_lG0^ z>?8sDTKBu9@pF61Z_Xvr2PlwK#%W7)?f1A>j&f|~PF%;&Xplf2f4W0avW0aAlIu1} zQBoT@BLioVYgh-Mc(3AY){GUUD6F*`W-An5dHHt2Uf010nfuT!u+i<{i3WWRESB_Z z0`HH2O_YB_jA!W+L{0b5VK;dpxE)Bmq(LX_E-_p*Gyn$=qDQ)k{-3{inj~~+sI)FE zQ{c!U)lau1Rmkvld7i#98t#L4Z(j)gk&Spg^FLa_DVZh8#v_6(nggm267xzuIQxj? z%Y$I<@)Qf*eiz*sn5)!79tX#G|3M@3kD%)x*W+EBCTxKfqo_~B{OgDGZz@HeRL17+ zL!CElpQS!5VB_VPl}1H21OZ}OC#V^2qJ+(ljBITYpgfgLRU#v?g$E#KPKzRj@g*Ki zea$T}>+&&p+r|!kyDyV!OTr9?rUt*8RdYJGzE_!3;E)3W*U{){U>|`0=#4D65w!*m zz<waQlOddX36}fVnsIWjc6T?SQML_<6Xl!6$8HLYB5qX~_ES3QEB$F=_(TN~t2=%om z=4x?SSWCCycfmpmit#A@zjTBDThs5H-SLhky{ginDM|ZJswvT;WeTXrc8UI3)~Hod zKqch!yMpnQoyRPJMMc$~9XX;%UD;48TXaTsJkgqjW1tnc1`@p= z#PJRhH?_(LV;3-=GJ@b?;|Qv=2Ki%4UnqC<8lh&Z9!52herK@29vgNp9vBKaLhky) z;wpdQ3q~=_kC!vHi9nJQ>5I{%Mjs9ffg%mp6IvuDj2DH@R9#K-R-4N2mN|BtyK-&K zPinOo-<;FA(rofa@EFl?LHv+12B!?F9H>ifR2#f)ajkwa3*p1rZ(*$WGsFq?GsJ06 z5b@5cuh=}BmGO_zqLeAWvyt<%6Wg@Yt=nmzdR4bH^n#xqBpsyGDe#PxY9RAj4U@@j z)nw}XvH4@+CT%wry91{6*e({G-gl|Q+kpFVJrrjsHpruED41#)azl}W95Py?$9@VI zk+8Vk`pP!PrpHM#Chuv3h(FgWX&t<8>jEdbe|)Vt0qfBW84jb~VG`JSiNzbN&q=-* zkh!VTsP}|J@yDs0jD8iiRAc4C7oC{rfXkuUbJ4_eDs)C4lSIqE<31ElQBVa5aKuwvb8QQ{I4A$LI8}UMw<*JLbe$cQmG+lHqKudAoq}z?mm%dZ0_7(rWje*u?mb zCDWJw-laO1&NS*NMGl-j6q>zn=2UBD{}QHg@ozTznFOnstCY+b_ zqBM(*qg(_#Teu^)r+Mp9U1=efA-ILk=o zl@mq#Ch9ioP41>)h3Xqt<(rwqT^Fj{n<3+2AFnaLCDm&x`lKt_MK;fbS(P{2V?qx4 zafoW1d}+ylDsqT9nJPWZ=Wa6fu}(=E(b>3bP4SK_yWJL<18m_X_ypPcX>X}!ZqIx1 zcf?*h26I^nP?`Xr=dsSD=gvzS)y@e`;dy$Xg<=t0Wuf|t0nj}Lze|M%tmI|kjTUe7 zB^#2dP0hoLN|24!X|M zk!8J^t@qVf(#3Aq&iRS>%bP1Nluy^(saL1hEHU=GeH47ZeQdpyoHfaZyK>CVOUfIl z8p*Bf!r5oqPN(dBDr4+vlQ+|^3Dq8R?->wb8+TbC&Y&q_lMv6T*S5ArgS9UrMW$;$ z6ppl6K+;fql_gV= zukwSkr3I~7T1;OL7Z=JZJOqSBpNbv07yVRqb+E41{FoXC#I7qX_c(LYE3~!0v-zO1 zn_Ek}0_)3wtk#~;S^QYNscp7RkF#pavxfW+z6x`RC9hu@)a3^{91f&lNA&mz>;#4^ zGH*1qfn^z(>_sxQac8mcG?xe1AO7R>y;OMWVNUI`yH<>D~IbA}{sdC^{V@ukU!k})_%L4W8 z3;U8G3OT-_KEry{023KKa=c#rpZje^f1xJDP;+l+*gJ08IYX;HyEsOh*;162Pop!t&5&9?WIpsn14 zVZU~OkdL=feA^SNVWCO$GJzc@};dNW~6Cjm2EWe*@2@wLbZ)o&~fJ| z`oj!KW`MAeLqWM?Wf_Q9YgPJR)+w)Nq*_xz{fq=d6t`bDrUj?ry z|Eu_;zq+52&HTO@nV9>zHJI(Pyu&!s-xjaceN%NbV#VcIQP#|UxHHEU>LmA0{{3G(A-r&_u+K{6CL%Yq;+TO=hL9EF92``CMwvq zXLmUW`U-yn!68GK-|{uG!ePsa+xzmQc}WspCD@sN?J2Yuf-K&~!?*H(p(c*a*!uec z70-{{{f=oY_*=k1dhRy`zNg5GHwe%U!W7-hWyF|N00<$fHMoKm!pv%ztZir4*uI(l z!tq&y>(Q5xEMyYTY94PXbB5vBkFIBhF3-8K?A~;-Cho|(#~ZhwdsXPeIRphI&7B#M zDAj>zloh?l5qH6IlKw4kgBD&;Z1Qf1c0Jp3$A+gj$;(|-x)Al_=YNRQ^MP;vl<_&5 zR~6Cvnv}#xxLp?>LJqudoiuT5k?^1^hIi{u75+FR8_paw!$>xne4AEoKZvIN(E?&K zY>|7h8J%fe7Liii2ZtUqe>vbdnv~3y^y#%t>`L|z`sa>iFN;^7FqaRR_BBI}+J;N7 zKRr!$l&bO978Q!1u`Lk&aW1#Ch{YnY^Jp>kSiamC?$S(Tc7l z2dQ4V?ezt5yB2al#Ot}n#I*&%a;N?gx5<$4;eamlP%c;h`9KN&j=&8%y%c?3-RrK0pQDh!bLFB?^Y(z#m0Nl=41fp0E~ba8V%X zZ=wNxphbK&%*hM}V>d-tH=(hzp%%F?O3HzRlPRnw`)DLi1d_UZnDih(cA)4kJ>I49 z`+g*~F0`uO+TNO?2Dljd?lDh}lu@S?x^XN^Pu#!h;`JC99L2p?0#hQj$%ha6D3;%@ zm-k~4!whJ9#cNIsIsEJh{2J&9Fyw}-w%XjzRf_Hx{EiA1N6IJDqF7IKr3NX5e7;-j z?^3q-!K&+FEqDQqE<6I}M)Sls$Jwd|ucWOW5jCbXhDb4Uwiv$sO$wvzo`-o!78n)9 znTMs2Un&t4s@ClE>tuJ-@R@Y|Ux$^ZNF4?@t%i0iB#C|Vu*=-w@D=iQT2;un;>HGZ zL(0a!sHP$E{^2VBK{v_W(c8r7t+X_*QNYz$F|;=mPzx3u0H5o1aoPDnK@$i6W;S?+ zxa_>VUdhH#IOI4N?+NnqZ|GSlhCWKIGk*aV;yLh6pfqHE&9KriHK>mp zu|8YrUg`{CQZy1bRnL$NR&a49(}dR%cOagz72!{1b_`qI$L}~nv-?ys6K%}{*2l!R z#oyNlFUgQjS9+w3`&Vl=QRVbQ@g$@4YMg28MY85>$-0L%jNejnJ_=#=H~u1&s%^>G zA>G6xGiJRC$hmiNq6)14$xCH^mo;GT$p28*6m71^@XJ~o(&`2I>SA@fXnmjkVSVqt z%8D3-W&3Lo7VrxE8H7bj+7Uvh{+mrg60#=-4F__|`FbLZnkL0M=7menQgnDCGa&0x zPi?~y^DfkkAP;^=b2)9^C;(4R)GeoA2B06Uyn+Gam0XgvHHrEZUTBM4XNrPxnSg-@ zo1ZrY&%?eQ=#gkJ_VTq^=r$uw>}t}O0;`z5TOZK4)M|jNx`N}yG66PB(FV2Dh<*$< zwj1uscC=p4lks=veqzkr(tFf-oiXK4Cj@h9+%$;~hmwWC`y4kb#)fwfAJn#t9F6xb zwP@(ZOv599-2yBa<6bclIp|hA1}05{`NFyM0h@wF<0w%$Jz_D#%6UMmZ34eCEqXg! zHq;nK13j|L4oE;0ez5pg zoqE~##^k{^$Wu}+UO6WJz2Jktz!)U@H$7#w>s~WzdPBd>V+H|2dOG1BAn}OTAZHW?#2ygu>A&q9E$I@Q z4tynG#WnpR-m7l@5@aXaUN^?kB|`p2^F~+amavP|?2_)10MkrVm4*F4u5?h~-K@{A z*GL_%f9CI{l#1$bivrYA#8%m$)-R7Kb4pxrTdwEAw$hGx&_(o_SyWYsW407=s zdh{YdkC08fVN%~S`B>yOJr7tXDw~3_d95(n7qCk{QwdO_=7t2wbNaV_MimMWpz7cH z60*^w#DogP^;lZRhesqm_Lf1K*;;L$NZQKBET7a|$*scBotT*97FDqg;F6$SIK{pt zN#Y~EF1$lxgzgp5H#KOFz3+3aEMN1=?5^G=%Fx5@UdI{bhElHy-1x%AcDp`*A6$Zv zjG^(qHCD_rG>~9Oopv-d&Bky`uyk}e#mY33PO-<-Sc(ij^A8Z4Pw?0NcUI7N-!!tJo3V4>s@rAFXa>4iK%~mqTv1m#wI)P=i=sU|x{&z( z8`8^>MMo|K+k!WP`*jDHD#A&5HXnQ?wGl1dq&(G-PB&_N`Vw$DCE+88p^uu|JHR~x z0P9WgO>28l@K;#)f9klXG|!n6C8G`AmZNb*Sd19eQUg7~W>^iW`Bwz5`y298$#Ry+XGscLIQ40I>EiCtbkD z2_#ICJ7(#jN`D@Ra~u}Nj%tzpO`d;q^6wOo^Ji)Qpa60~M9lh!ne+UYPSMaRa$30M z@hRykK8ENNYXt!Z``g<_#Ot)HYo&vr&m9}g3+sdKJpKzeLrLCX1p+ANg39p)cEEmE z1k#*I6Fy0dsajgNZ?-cH_T)OH+*%o1^Q>{(r`y%99M zb!W-EXEFIeu5`pAzx6LB#((k-y8m0!q6z(P)wfW@H-)~O*qxJj zkUFWz!N*JFBgejaNeuEG@342eFq5F_<#X)C(19V`(~G5E_x;ds-{e;>yPUCVd2pw} z^UhsA_mpUdWvXX-2Ylbr*6m*YxVCu1nfkb>r{DSI^wA3}XPYN$cLOOV&P3m5E9MoF z=bw2oo)B%gHF5gtu}I;Bv)lnDja^@!c!qO)(YrR%u--`;7m?Y=N^WD9uQ-3X&>kL? zDaq@;i(LO0F&)V0lFQrjT-uzx;24XIJY|kAjZ56Ed-BaovFa)z6f7CEflMMX@rMT^ z=OwgmcnGxaToa)zkwscR!0F1~y}9cDRrYY5q{`imqzk)GrQUk{f1AgDR(z67?U`r1 zxI+>YO5l@qu?1)UnQv3vfQPsSu`@8ppejtsPcF?(%`4HX$jt$V@7}4W^O_9=T)$8K z#ed>=k^-maY6r8>r8(Na82Nbm#q3k8Lx2A6%a|;nX(4@tEt9RVw&d*GoA2r>Ue`98 z^@?zE{%xpGD2g;$^EUd3teMIrbg5Bs_m_`}zxi}G|CqQ^I@KmbP)%{` z)>o}Tldm6``Ee;zW4_l)%gqt5y0oU%Z{*4lVKKbw%sVMAv+B2!VpY72u>Nb2c{TCT z(^4lNUVWxtre$v-ORmMd-X@>$1mQyqGj7Bif1A33WAE7pxibeh6dA60o*1!9;!&l9 zm|oje8=i^XiI)7%FOnjBP9_+xZ;tt*`gZ=penz>|t|qF@jM;^+B(D7Ff4=gu6NmcO zg;Nfty}7`*$71^&k;ztyeSa9F_U?!%%(K)yr1?I%CM@rdKkMSdMn^=Aj&F(CeaUd8 z@Ub%8b$d_O-@Lwj_JZ))27g&mlk>7Gf_f8y;co;?@1UE)qMh^eN`QeLA5vM6S{w@s z`>i3-{)Y@i>dZgd>(rXAdC+XwcCdN-5%#By^$u^(E!Yuvsf^?Qy~_v1WScu*oSyXU z%kDYv*U0vT8}(01n0rA>v3ZBTQb5ddr?WzztZHAxPCik&ENEIbD`#Z0^5cs?Zx-w_ zd!Xc^J$=H?@6XzTjz3qJ*}avqb*fMFNgKVlJyOT+-{g6by1(9aXPDfS_dgFfx*fJY z5i#-ii@Mg^(&}z!JxX?4iZ2mTN;%M8d#fu#BBOmuYuTC0Pd0|C#?7cT5-YlXz#zHk z;LPJ3FN2o$eyhHHE!kyS`kfew^2VQUGF3wMZT}aV&|Q6SX5>UClf-NG#+{58Lq2z2 zJr-yqFQ1mVaph*80*5}QM>$Cxn>`fYN-kk}&3a`Xe^zns!-|huiyQ2sHWtL4erzhu z`+3r{_DAx!mMH>nGG3l0d&3}&@7%+^lPhC@!{s4gS8q8Q_v^%mSw1(T|8?JymV6_z za;3HJ3a5RIuD{j!la9Oi-pxGJ_&wv`-@WZ!J8w6|KmQ=l=5^1nvR~ie!Y6AB%hpND zCM|i|ZU2iUz?+dtgaJ_`p~oRG8iB`CD*(w0znQSbD8vBVzIiXrx? zBWp`6C;+8dblpAA`u0Ttb(aHm3xX|zxpp5=6mDs9eo-nm?b0VN&C~)a6a;Dqlhu&a^HK-b=Aqwtjh7(RD^&KH6>AL@`P z*--6iz|tlpF)0Tr)UgK|Y6u+3gX)JI){buR9;qKjyHyz()&Mc+@ z4MA5aq8nlN**tb}5d*_KAVxLf=VnHT*O3m2H^OGbEsL|8U&}EtJOg4>BW_Q@G{P90 z5%mq1x>{5i80vu-)reqMXc|Crg$Xtzk{5|w2n4#o2g4QT)i8}P#byNhU6hF6%;?87 z0(>(idT{RCdEkw