jml 5 days ago
parent e560aabae6
commit ff4d2b2731

@ -0,0 +1 @@
<html><head><title>net</title></head><body><a href="micode/index.html"><b>micode</b></a><br /></body></html>

@ -0,0 +1 @@
<html><head><title>net.micode</title></head><body><a href="notes/index.html"><b>notes</b></a><br /></body></html>

@ -0,0 +1,47 @@
<html>
<head>
<title>ExampleInstrumentedTest.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #0033b3;}
.s1 { color: #080808;}
.s2 { color: #8c8c8c; font-style: italic;}
.s3 { color: #8c8c8c; font-style: italic;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ExampleInstrumentedTest.java</font>
</center></td></tr></table>
<pre><span class="s0">package </span><span class="s1">net.micode.notes;</span>
<span class="s0">import </span><span class="s1">android.content.Context;</span>
<span class="s0">import </span><span class="s1">androidx.test.platform.app.InstrumentationRegistry;</span>
<span class="s0">import </span><span class="s1">androidx.test.ext.junit.runners.AndroidJUnit4;</span>
<span class="s0">import </span><span class="s1">org.junit.Test;</span>
<span class="s0">import </span><span class="s1">org.junit.runner.RunWith;</span>
<span class="s0">import static </span><span class="s1">org.junit.Assert.*;</span>
<span class="s2">/**</span>
<span class="s2">* Instrumented test, which will execute on an Android device.</span>
<span class="s2">*</span>
<span class="s2">* </span><span class="s3">@see </span><span class="s4">&lt;a href=&quot;http://d.android.com/tools/testing&quot;&gt;</span><span class="s2">Testing documentation</span><span class="s4">&lt;/a&gt;</span>
<span class="s2">*/</span>
<span class="s1">@RunWith(AndroidJUnit4.</span><span class="s0">class</span><span class="s1">)</span>
<span class="s0">public class </span><span class="s1">ExampleInstrumentedTest {</span>
<span class="s1">@Test</span>
<span class="s0">public void </span><span class="s1">useAppContext() {</span>
<span class="s2">// Context of the app under test.</span>
<span class="s1">Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();</span>
<span class="s1">assertEquals(</span><span class="s5">&quot;net.micode.notes&quot;</span><span class="s1">, appContext.getPackageName());</span>
<span class="s1">}</span>
<span class="s1">}</span></pre>
</body>
</html>

@ -0,0 +1,38 @@
<html>
<head>
<title>ExampleUnitTest.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #0033b3;}
.s1 { color: #080808;}
.s2 { color: #8c8c8c; font-style: italic;}
.s3 { color: #8c8c8c; font-style: italic;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ExampleUnitTest.java</font>
</center></td></tr></table>
<pre><span class="s0">package </span><span class="s1">net.micode.notes;</span>
<span class="s0">import </span><span class="s1">org.junit.Test;</span>
<span class="s0">import static </span><span class="s1">org.junit.Assert.*;</span>
<span class="s2">/**</span>
<span class="s2">* Example local unit test, which will execute on the development machine (host).</span>
<span class="s2">*</span>
<span class="s2">* </span><span class="s3">@see </span><span class="s4">&lt;a href=&quot;http://d.android.com/tools/testing&quot;&gt;</span><span class="s2">Testing documentation</span><span class="s4">&lt;/a&gt;</span>
<span class="s2">*/</span>
<span class="s0">public class </span><span class="s1">ExampleUnitTest {</span>
<span class="s1">@Test</span>
<span class="s0">public void </span><span class="s1">addition_isCorrect() {</span>
<span class="s1">assertEquals(</span><span class="s5">4</span><span class="s1">, </span><span class="s5">2 </span><span class="s1">+ </span><span class="s5">2</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span></pre>
</body>
</html>

@ -0,0 +1,41 @@
<html>
<head>
<title>MainActivity.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #0033b3;}
.s1 { color: #080808;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
MainActivity.java</font>
</center></td></tr></table>
<pre><span class="s0">package </span><span class="s1">net.micode.notes;</span>
<span class="s0">import </span><span class="s1">android.os.Bundle;</span>
<span class="s0">import </span><span class="s1">androidx.activity.EdgeToEdge;</span>
<span class="s0">import </span><span class="s1">androidx.appcompat.app.AppCompatActivity;</span>
<span class="s0">import </span><span class="s1">androidx.core.graphics.Insets;</span>
<span class="s0">import </span><span class="s1">androidx.core.view.ViewCompat;</span>
<span class="s0">import </span><span class="s1">androidx.core.view.WindowInsetsCompat;</span>
<span class="s0">public class </span><span class="s1">MainActivity </span><span class="s0">extends </span><span class="s1">AppCompatActivity {</span>
<span class="s1">@Override</span>
<span class="s0">protected void </span><span class="s1">onCreate(Bundle savedInstanceState) {</span>
<span class="s0">super</span><span class="s1">.onCreate(savedInstanceState);</span>
<span class="s1">EdgeToEdge.enable(</span><span class="s0">this</span><span class="s1">);</span>
<span class="s1">setContentView(R.layout.activity_main);</span>
<span class="s1">ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -&gt; {</span>
<span class="s1">Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());</span>
<span class="s1">v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);</span>
<span class="s0">return </span><span class="s1">insets;</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s1">}</span></pre>
</body>
</html>

@ -0,0 +1,94 @@
<html>
<head>
<title>Contact.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Contact.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.data;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.provider.ContactsContract.CommonDataKinds.Phone;</span>
<span class="s2">import </span><span class="s1">android.provider.ContactsContract.Data;</span>
<span class="s2">import </span><span class="s1">android.telephony.PhoneNumberUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
<span class="s2">public class </span><span class="s1">Contact {</span>
<span class="s2">private static </span><span class="s1">HashMap&lt;String, String&gt; sContactCache;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;Contact&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String CALLER_ID_SELECTION = </span><span class="s3">&quot;PHONE_NUMBERS_EQUAL(&quot; </span><span class="s1">+ Phone.NUMBER</span>
<span class="s1">+ </span><span class="s3">&quot;,?) AND &quot; </span><span class="s1">+ Data.MIMETYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ Phone.CONTENT_ITEM_TYPE + </span><span class="s3">&quot;'&quot;</span>
<span class="s1">+ </span><span class="s3">&quot; AND &quot; </span><span class="s1">+ Data.RAW_CONTACT_ID + </span><span class="s3">&quot; IN &quot;</span>
<span class="s1">+ </span><span class="s3">&quot;(SELECT raw_contact_id &quot;</span>
<span class="s1">+ </span><span class="s3">&quot; FROM phone_lookup&quot;</span>
<span class="s1">+ </span><span class="s3">&quot; WHERE min_match = '+')&quot;</span><span class="s1">;</span>
<span class="s2">public static </span><span class="s1">String getContact(Context context, String phoneNumber) {</span>
<span class="s2">if</span><span class="s1">(sContactCache == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">sContactCache = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, String&gt;();</span>
<span class="s1">}</span>
<span class="s2">if</span><span class="s1">(sContactCache.containsKey(phoneNumber)) {</span>
<span class="s2">return </span><span class="s1">sContactCache.get(phoneNumber);</span>
<span class="s1">}</span>
<span class="s1">String selection = CALLER_ID_SELECTION.replace(</span><span class="s3">&quot;+&quot;</span><span class="s1">,</span>
<span class="s1">PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));</span>
<span class="s1">Cursor cursor = context.getContentResolver().query(</span>
<span class="s1">Data.CONTENT_URI,</span>
<span class="s2">new </span><span class="s1">String [] { Phone.DISPLAY_NAME },</span>
<span class="s1">selection,</span>
<span class="s2">new </span><span class="s1">String[] { phoneNumber },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null </span><span class="s1">&amp;&amp; cursor.moveToFirst()) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">String name = cursor.getString(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">sContactCache.put(phoneNumber, name);</span>
<span class="s2">return </span><span class="s1">name;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IndexOutOfBoundsException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot; Cursor get string error &quot; </span><span class="s1">+ e.toString());</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;No contact matched with number:&quot; </span><span class="s1">+ phoneNumber);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,302 @@
<html>
<head>
<title>Notes.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
.s6 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Notes.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.data;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">public class </span><span class="s1">Notes {</span>
<span class="s2">public static final </span><span class="s1">String AUTHORITY = </span><span class="s3">&quot;micode_notes&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String TAG = </span><span class="s3">&quot;Notes&quot;</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_NOTE = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_FOLDER = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_SYSTEM = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Following IDs are system folders' identifiers</span>
<span class="s0">* {</span><span class="s5">@link </span><span class="s0">Notes#ID_ROOT_FOLDER } is default folder</span>
<span class="s0">* {</span><span class="s5">@link </span><span class="s0">Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder</span>
<span class="s0">* {</span><span class="s5">@link </span><span class="s0">Notes#ID_CALL_RECORD_FOLDER} is to store call records</span>
<span class="s0">*/</span>
<span class="s2">public static final int </span><span class="s1">ID_ROOT_FOLDER = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ID_TEMPARAY_FOLDER = -</span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ID_CALL_RECORD_FOLDER = -</span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ID_TRASH_FOLER = -</span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_ALERT_DATE = </span><span class="s3">&quot;net.micode.notes.alert_date&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_BACKGROUND_ID = </span><span class="s3">&quot;net.micode.notes.background_color_id&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_WIDGET_ID = </span><span class="s3">&quot;net.micode.notes.widget_id&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_WIDGET_TYPE = </span><span class="s3">&quot;net.micode.notes.widget_type&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_FOLDER_ID = </span><span class="s3">&quot;net.micode.notes.folder_id&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_CALL_DATE = </span><span class="s3">&quot;net.micode.notes.call_date&quot;</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_WIDGET_INVALIDE = -</span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_WIDGET_2X = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_WIDGET_4X = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public static class </span><span class="s1">DataConstants {</span>
<span class="s2">public static final </span><span class="s1">String NOTE = TextNote.CONTENT_ITEM_TYPE;</span>
<span class="s2">public static final </span><span class="s1">String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Uri to query all notes and folders</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">Uri CONTENT_NOTE_URI = Uri.parse(</span><span class="s3">&quot;content://&quot; </span><span class="s1">+ AUTHORITY + </span><span class="s3">&quot;/note&quot;</span><span class="s1">);</span>
<span class="s0">/**</span>
<span class="s0">* Uri to query data</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">Uri CONTENT_DATA_URI = Uri.parse(</span><span class="s3">&quot;content://&quot; </span><span class="s1">+ AUTHORITY + </span><span class="s3">&quot;/data&quot;</span><span class="s1">);</span>
<span class="s2">public interface </span><span class="s1">NoteColumns {</span>
<span class="s0">/**</span>
<span class="s0">* The unique ID for a row</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String ID = </span><span class="s3">&quot;_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The parent's id for note or folder</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String PARENT_ID = </span><span class="s3">&quot;parent_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Created data for note or folder</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String CREATED_DATE = </span><span class="s3">&quot;created_date&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Latest modified date</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String MODIFIED_DATE = </span><span class="s3">&quot;modified_date&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Alert date</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String ALERTED_DATE = </span><span class="s3">&quot;alert_date&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Folder's name or text content of note</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String SNIPPET = </span><span class="s3">&quot;snippet&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Note's widget id</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String WIDGET_ID = </span><span class="s3">&quot;widget_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Note's widget type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String WIDGET_TYPE = </span><span class="s3">&quot;widget_type&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Note's background color's id</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String BG_COLOR_ID = </span><span class="s3">&quot;bg_color_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* For text note, it doesn't has attachment, for multi-media</span>
<span class="s0">* note, it has at least one attachment</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String HAS_ATTACHMENT = </span><span class="s3">&quot;has_attachment&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Folder's count of notes</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String NOTES_COUNT = </span><span class="s3">&quot;notes_count&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The file type: folder or note</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String TYPE = </span><span class="s3">&quot;type&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The last sync id</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String SYNC_ID = </span><span class="s3">&quot;sync_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Sign to indicate local modified or not</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String LOCAL_MODIFIED = </span><span class="s3">&quot;local_modified&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Original parent id before moving into temporary folder</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type : INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String ORIGIN_PARENT_ID = </span><span class="s3">&quot;origin_parent_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The gtask id</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type : TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String GTASK_ID = </span><span class="s3">&quot;gtask_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The version code</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type : INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String VERSION = </span><span class="s3">&quot;version&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public interface </span><span class="s1">DataColumns {</span>
<span class="s0">/**</span>
<span class="s0">* The unique ID for a row</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String ID = </span><span class="s3">&quot;_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The MIME type of the item represented by this row.</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: Text </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String MIME_TYPE = </span><span class="s3">&quot;mime_type&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* The reference id to note that this data belongs to</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String NOTE_ID = </span><span class="s3">&quot;note_id&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Created data for note or folder</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String CREATED_DATE = </span><span class="s3">&quot;created_date&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Latest modified date</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String MODIFIED_DATE = </span><span class="s3">&quot;modified_date&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Data's content</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String CONTENT = </span><span class="s3">&quot;content&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Generic data column, the meaning is {</span><span class="s5">@link </span><span class="s0">#MIMETYPE} specific, used for</span>
<span class="s0">* integer data type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String DATA1 = </span><span class="s3">&quot;data1&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Generic data column, the meaning is {</span><span class="s5">@link </span><span class="s0">#MIMETYPE} specific, used for</span>
<span class="s0">* integer data type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String DATA2 = </span><span class="s3">&quot;data2&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Generic data column, the meaning is {</span><span class="s5">@link </span><span class="s0">#MIMETYPE} specific, used for</span>
<span class="s0">* TEXT data type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String DATA3 = </span><span class="s3">&quot;data3&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Generic data column, the meaning is {</span><span class="s5">@link </span><span class="s0">#MIMETYPE} specific, used for</span>
<span class="s0">* TEXT data type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String DATA4 = </span><span class="s3">&quot;data4&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Generic data column, the meaning is {</span><span class="s5">@link </span><span class="s0">#MIMETYPE} specific, used for</span>
<span class="s0">* TEXT data type</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String DATA5 = </span><span class="s3">&quot;data5&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static final class </span><span class="s1">TextNote </span><span class="s2">implements </span><span class="s1">DataColumns {</span>
<span class="s0">/**</span>
<span class="s0">* Mode to indicate the text in check list mode or not</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: Integer 1:check list mode 0: normal mode </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String MODE = DATA1;</span>
<span class="s2">public static final int </span><span class="s1">MODE_CHECK_LIST = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String CONTENT_TYPE = </span><span class="s3">&quot;vnd.android.cursor.dir/text_note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String CONTENT_ITEM_TYPE = </span><span class="s3">&quot;vnd.android.cursor.item/text_note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">Uri CONTENT_URI = Uri.parse(</span><span class="s3">&quot;content://&quot; </span><span class="s1">+ AUTHORITY + </span><span class="s3">&quot;/text_note&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public static final class </span><span class="s1">CallNote </span><span class="s2">implements </span><span class="s1">DataColumns {</span>
<span class="s0">/**</span>
<span class="s0">* Call date for this record</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: INTEGER (long) </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String CALL_DATE = DATA1;</span>
<span class="s0">/**</span>
<span class="s0">* Phone number for this record</span>
<span class="s0">* </span><span class="s6">&lt;P&gt; </span><span class="s0">Type: TEXT </span><span class="s6">&lt;/P&gt;</span>
<span class="s0">*/</span>
<span class="s2">public static final </span><span class="s1">String PHONE_NUMBER = DATA3;</span>
<span class="s2">public static final </span><span class="s1">String CONTENT_TYPE = </span><span class="s3">&quot;vnd.android.cursor.dir/call_note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String CONTENT_ITEM_TYPE = </span><span class="s3">&quot;vnd.android.cursor.item/call_note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">Uri CONTENT_URI = Uri.parse(</span><span class="s3">&quot;content://&quot; </span><span class="s1">+ AUTHORITY + </span><span class="s3">&quot;/call_note&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,384 @@
<html>
<head>
<title>NotesDatabaseHelper.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NotesDatabaseHelper.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.data;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.sqlite.SQLiteDatabase;</span>
<span class="s2">import </span><span class="s1">android.database.sqlite.SQLiteOpenHelper;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">public class </span><span class="s1">NotesDatabaseHelper </span><span class="s2">extends </span><span class="s1">SQLiteOpenHelper {</span>
<span class="s2">private static final </span><span class="s1">String DB_NAME = </span><span class="s3">&quot;note.db&quot;</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DB_VERSION = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">public interface </span><span class="s1">TABLE {</span>
<span class="s2">public static final </span><span class="s1">String NOTE = </span><span class="s3">&quot;note&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String DATA = </span><span class="s3">&quot;data&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NotesDatabaseHelper&quot;</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">NotesDatabaseHelper mInstance;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_NOTE_TABLE_SQL =</span>
<span class="s3">&quot;CREATE TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot;(&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ID + </span><span class="s3">&quot; INTEGER PRIMARY KEY,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.PARENT_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ALERTED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.BG_COLOR_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.HAS_ATTACHMENT + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.SNIPPET + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.WIDGET_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.WIDGET_TYPE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT -1,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.SYNC_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.LOCAL_MODIFIED + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.ORIGIN_PARENT_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.GTASK_ID + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.VERSION + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0&quot; </span><span class="s1">+</span>
<span class="s3">&quot;)&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_DATA_TABLE_SQL =</span>
<span class="s3">&quot;CREATE TABLE &quot; </span><span class="s1">+ TABLE.DATA + </span><span class="s3">&quot;(&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.ID + </span><span class="s3">&quot; INTEGER PRIMARY KEY,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.MIME_TYPE + </span><span class="s3">&quot; TEXT NOT NULL,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.NOTE_ID + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0,&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000),&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.CONTENT + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA1 + </span><span class="s3">&quot; INTEGER,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA2 + </span><span class="s3">&quot; INTEGER,&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA3 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA4 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT '',&quot; </span><span class="s1">+</span>
<span class="s1">DataColumns.DATA5 + </span><span class="s3">&quot; TEXT NOT NULL DEFAULT ''&quot; </span><span class="s1">+</span>
<span class="s3">&quot;)&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String CREATE_DATA_NOTE_ID_INDEX_SQL =</span>
<span class="s3">&quot;CREATE INDEX IF NOT EXISTS note_id_index ON &quot; </span><span class="s1">+</span>
<span class="s1">TABLE.DATA + </span><span class="s3">&quot;(&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;);&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Increase folder's note count when move note to the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER increase_folder_count_on_update &quot;</span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE OF &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot; ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; + 1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Decrease folder's note count when move note from folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER decrease_folder_count_on_update &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE OF &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot; ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;-1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;&gt;0&quot; </span><span class="s1">+ </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Increase folder's note count when insert new note to the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER increase_folder_count_on_insert &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER INSERT ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot; + 1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Decrease folder's note count when delete note from the folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER decrease_folder_count_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN &quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;-1&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">&quot;&gt;0;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when insert data with type {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE}</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_insert &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER INSERT ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN new.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.CONTENT +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when data with {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE} type has changed</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_update &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN old.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.CONTENT +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=new.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Update note's content when data with {</span><span class="s5">@link </span><span class="s0">DataConstants#NOTE} type has deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER update_note_content_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER delete ON &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHEN old.&quot; </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">&quot;='&quot; </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">&quot;'&quot; </span><span class="s1">+</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=''&quot; </span><span class="s1">+</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Delete datas belong to note which has been deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER delete_data_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; DELETE FROM &quot; </span><span class="s1">+ TABLE.DATA +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Delete notes belong to folder which has been deleted</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER folder_delete_notes_on_delete &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER DELETE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; DELETE FROM &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Move notes belong to folder which has been moved to trash folder</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =</span>
<span class="s3">&quot;CREATE TRIGGER folder_move_notes_on_trash &quot; </span><span class="s1">+</span>
<span class="s3">&quot; AFTER UPDATE ON &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; WHEN new.&quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
<span class="s3">&quot; BEGIN&quot; </span><span class="s1">+</span>
<span class="s3">&quot; UPDATE &quot; </span><span class="s1">+ TABLE.NOTE +</span>
<span class="s3">&quot; SET &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
<span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;=old.&quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;;&quot; </span><span class="s1">+</span>
<span class="s3">&quot; END&quot;</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">NotesDatabaseHelper(Context context) {</span>
<span class="s2">super</span><span class="s1">(context, DB_NAME, </span><span class="s2">null</span><span class="s1">, DB_VERSION);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createNoteTable(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(CREATE_NOTE_TABLE_SQL);</span>
<span class="s1">reCreateNoteTableTriggers(db);</span>
<span class="s1">createSystemFolder(db);</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;note table has been created&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">reCreateNoteTableTriggers(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS increase_folder_count_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS decrease_folder_count_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS decrease_folder_count_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS delete_data_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS increase_folder_count_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS folder_delete_notes_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS folder_move_notes_on_trash&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);</span>
<span class="s1">db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);</span>
<span class="s1">db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">createSystemFolder(SQLiteDatabase db) {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s0">/**</span>
<span class="s0">* call record foler for call notes</span>
<span class="s0">*/</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* root folder which is default folder</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* temporary folder which is used for moving note</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s0">/**</span>
<span class="s0">* create trash folder</span>
<span class="s0">*/</span>
<span class="s1">values.clear();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createDataTable(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(CREATE_DATA_TABLE_SQL);</span>
<span class="s1">reCreateDataTableTriggers(db);</span>
<span class="s1">db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;data table has been created&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">reCreateDataTableTriggers(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_update&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_content_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);</span>
<span class="s1">db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);</span>
<span class="s1">}</span>
<span class="s2">static synchronized </span><span class="s1">NotesDatabaseHelper getInstance(Context context) {</span>
<span class="s2">if </span><span class="s1">(mInstance == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mInstance = </span><span class="s2">new </span><span class="s1">NotesDatabaseHelper(context);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mInstance;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onCreate(SQLiteDatabase db) {</span>
<span class="s1">createNoteTable(db);</span>
<span class="s1">createDataTable(db);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onUpgrade(SQLiteDatabase db, </span><span class="s2">int </span><span class="s1">oldVersion, </span><span class="s2">int </span><span class="s1">newVersion) {</span>
<span class="s2">boolean </span><span class="s1">reCreateTriggers = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">boolean </span><span class="s1">skipV2 = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">1</span><span class="s1">) {</span>
<span class="s1">upgradeToV2(db);</span>
<span class="s1">skipV2 = </span><span class="s2">true</span><span class="s1">; </span><span class="s0">// this upgrade including the upgrade from v2 to v3</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">2 </span><span class="s1">&amp;&amp; !skipV2) {</span>
<span class="s1">upgradeToV3(db);</span>
<span class="s1">reCreateTriggers = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion == </span><span class="s4">3</span><span class="s1">) {</span>
<span class="s1">upgradeToV4(db);</span>
<span class="s1">oldVersion++;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(reCreateTriggers) {</span>
<span class="s1">reCreateNoteTableTriggers(db);</span>
<span class="s1">reCreateDataTableTriggers(db);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVersion != newVersion) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s3">&quot;Upgrade notes database to version &quot; </span><span class="s1">+ newVersion</span>
<span class="s1">+ </span><span class="s3">&quot;fails&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV2(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TABLE IF EXISTS &quot; </span><span class="s1">+ TABLE.NOTE);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TABLE IF EXISTS &quot; </span><span class="s1">+ TABLE.DATA);</span>
<span class="s1">createNoteTable(db);</span>
<span class="s1">createDataTable(db);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV3(SQLiteDatabase db) {</span>
<span class="s0">// drop unused triggers</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_insert&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_delete&quot;</span><span class="s1">);</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;DROP TRIGGER IF EXISTS update_note_modified_date_on_update&quot;</span><span class="s1">);</span>
<span class="s0">// add a column for gtask id</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;ALTER TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot; ADD COLUMN &quot; </span><span class="s1">+ NoteColumns.GTASK_ID</span>
<span class="s1">+ </span><span class="s3">&quot; TEXT NOT NULL DEFAULT ''&quot;</span><span class="s1">);</span>
<span class="s0">// add a trash system folder</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s1">db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">upgradeToV4(SQLiteDatabase db) {</span>
<span class="s1">db.execSQL(</span><span class="s3">&quot;ALTER TABLE &quot; </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">&quot; ADD COLUMN &quot; </span><span class="s1">+ NoteColumns.VERSION</span>
<span class="s1">+ </span><span class="s3">&quot; INTEGER NOT NULL DEFAULT 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,327 @@
<html>
<head>
<title>NotesProvider.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #0037a6;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NotesProvider.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.data;</span>
<span class="s2">import </span><span class="s1">android.app.SearchManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProvider;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.content.UriMatcher;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.database.sqlite.SQLiteDatabase;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.NotesDatabaseHelper.TABLE;</span>
<span class="s2">public class </span><span class="s1">NotesProvider </span><span class="s2">extends </span><span class="s1">ContentProvider {</span>
<span class="s2">private static final </span><span class="s1">UriMatcher mMatcher;</span>
<span class="s2">private </span><span class="s1">NotesDatabaseHelper mHelper;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NotesProvider&quot;</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_NOTE = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_NOTE_ITEM = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_DATA = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_DATA_ITEM = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_SEARCH = </span><span class="s4">5</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">URI_SEARCH_SUGGEST = </span><span class="s4">6</span><span class="s1">;</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">mMatcher = </span><span class="s2">new </span><span class="s1">UriMatcher(UriMatcher.NO_MATCH);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">&quot;note&quot;</span><span class="s1">, URI_NOTE);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">&quot;note/#&quot;</span><span class="s1">, URI_NOTE_ITEM);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">&quot;data&quot;</span><span class="s1">, URI_DATA);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">&quot;data/#&quot;</span><span class="s1">, URI_DATA_ITEM);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">&quot;search&quot;</span><span class="s1">, URI_SEARCH);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST);</span>
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + </span><span class="s3">&quot;/*&quot;</span><span class="s1">, URI_SEARCH_SUGGEST);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* x'0A' represents the '\n' character in sqlite. For title and content in the search result,</span>
<span class="s0">* we will trim '\n' and white space in order to show more information.</span>
<span class="s0">*/</span>
<span class="s2">private static final </span><span class="s1">String NOTES_SEARCH_PROJECTION = NoteColumns.ID + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot; AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ </span><span class="s3">&quot;TRIM(REPLACE(&quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;, x'0A','')) AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_TEXT_1 + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ </span><span class="s3">&quot;TRIM(REPLACE(&quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;, x'0A','')) AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_TEXT_2 + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ R.drawable.search_result + </span><span class="s3">&quot; AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_ICON_1 + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ </span><span class="s3">&quot;'&quot; </span><span class="s1">+ Intent.ACTION_VIEW + </span><span class="s3">&quot;' AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_INTENT_ACTION + </span><span class="s3">&quot;,&quot;</span>
<span class="s1">+ </span><span class="s3">&quot;'&quot; </span><span class="s1">+ Notes.TextNote.CONTENT_TYPE + </span><span class="s3">&quot;' AS &quot; </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_INTENT_DATA;</span>
<span class="s2">private static </span><span class="s1">String NOTES_SNIPPET_SEARCH_QUERY = </span><span class="s3">&quot;SELECT &quot; </span><span class="s1">+ NOTES_SEARCH_PROJECTION</span>
<span class="s1">+ </span><span class="s3">&quot; FROM &quot; </span><span class="s1">+ TABLE.NOTE</span>
<span class="s1">+ </span><span class="s3">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot; LIKE ?&quot;</span>
<span class="s1">+ </span><span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;&lt;&gt;&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER</span>
<span class="s1">+ </span><span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.TYPE_NOTE;</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onCreate() {</span>
<span class="s1">mHelper = NotesDatabaseHelper.getInstance(getContext());</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,</span>
<span class="s1">String sortOrder) {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">SQLiteDatabase db = mHelper.getReadableDatabase();</span>
<span class="s1">String id = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">switch </span><span class="s1">(mMatcher.match(uri)) {</span>
<span class="s2">case </span><span class="s1">URI_NOTE:</span>
<span class="s1">c = db.query(TABLE.NOTE, projection, selection, selectionArgs, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s1">sortOrder);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_NOTE_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">c = db.query(TABLE.NOTE, projection, NoteColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id</span>
<span class="s1">+ parseSelection(selection), selectionArgs, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, sortOrder);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA:</span>
<span class="s1">c = db.query(TABLE.DATA, projection, selection, selectionArgs, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s1">sortOrder);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">c = db.query(TABLE.DATA, projection, DataColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id</span>
<span class="s1">+ parseSelection(selection), selectionArgs, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, sortOrder);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_SEARCH:</span>
<span class="s2">case </span><span class="s1">URI_SEARCH_SUGGEST:</span>
<span class="s2">if </span><span class="s1">(sortOrder != </span><span class="s2">null </span><span class="s1">|| projection != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span>
<span class="s3">&quot;do not specify sortOrder, selection, selectionArgs, or projection&quot; </span><span class="s1">+ </span><span class="s3">&quot;with this query&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">String searchString = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mMatcher.match(uri) == URI_SEARCH_SUGGEST) {</span>
<span class="s2">if </span><span class="s1">(uri.getPathSegments().size() &gt; </span><span class="s4">1</span><span class="s1">) {</span>
<span class="s1">searchString = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">searchString = uri.getQueryParameter(</span><span class="s3">&quot;pattern&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(TextUtils.isEmpty(searchString)) {</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">searchString = String.format(</span><span class="s3">&quot;%%%s%%&quot;</span><span class="s1">, searchString);</span>
<span class="s1">c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,</span>
<span class="s2">new </span><span class="s1">String[] { searchString });</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IllegalStateException ex) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;got exception: &quot; </span><span class="s1">+ ex.toString());</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unknown URI &quot; </span><span class="s1">+ uri);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.setNotificationUri(getContext().getContentResolver(), uri);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">c;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">Uri insert(Uri uri, ContentValues values) {</span>
<span class="s1">SQLiteDatabase db = mHelper.getWritableDatabase();</span>
<span class="s2">long </span><span class="s1">dataId = </span><span class="s4">0</span><span class="s1">, noteId = </span><span class="s4">0</span><span class="s1">, insertedId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">switch </span><span class="s1">(mMatcher.match(uri)) {</span>
<span class="s2">case </span><span class="s1">URI_NOTE:</span>
<span class="s1">insertedId = noteId = db.insert(TABLE.NOTE, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA:</span>
<span class="s2">if </span><span class="s1">(values.containsKey(DataColumns.NOTE_ID)) {</span>
<span class="s1">noteId = values.getAsLong(DataColumns.NOTE_ID);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Wrong data format without note id:&quot; </span><span class="s1">+ values.toString());</span>
<span class="s1">}</span>
<span class="s1">insertedId = dataId = db.insert(TABLE.DATA, </span><span class="s2">null</span><span class="s1">, values);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unknown URI &quot; </span><span class="s1">+ uri);</span>
<span class="s1">}</span>
<span class="s0">// Notify the note uri</span>
<span class="s2">if </span><span class="s1">(noteId &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">getContext().getContentResolver().notifyChange(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s0">// Notify the data uri</span>
<span class="s2">if </span><span class="s1">(dataId &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">getContext().getContentResolver().notifyChange(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">ContentUris.withAppendedId(uri, insertedId);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public int </span><span class="s1">delete(Uri uri, String selection, String[] selectionArgs) {</span>
<span class="s2">int </span><span class="s1">count = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">String id = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">SQLiteDatabase db = mHelper.getWritableDatabase();</span>
<span class="s2">boolean </span><span class="s1">deleteData = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">switch </span><span class="s1">(mMatcher.match(uri)) {</span>
<span class="s2">case </span><span class="s1">URI_NOTE:</span>
<span class="s1">selection = </span><span class="s3">&quot;(&quot; </span><span class="s1">+ selection + </span><span class="s3">&quot;) AND &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;&gt;0 &quot;</span><span class="s1">;</span>
<span class="s1">count = db.delete(TABLE.NOTE, selection, selectionArgs);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_NOTE_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s0">/**</span>
<span class="s0">* ID that smaller than 0 is system folder which is not allowed to</span>
<span class="s0">* trash</span>
<span class="s0">*/</span>
<span class="s2">long </span><span class="s1">noteId = Long.valueOf(id);</span>
<span class="s2">if </span><span class="s1">(noteId &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">count = db.delete(TABLE.NOTE,</span>
<span class="s1">NoteColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id + parseSelection(selection), selectionArgs);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA:</span>
<span class="s1">count = db.delete(TABLE.DATA, selection, selectionArgs);</span>
<span class="s1">deleteData = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">count = db.delete(TABLE.DATA,</span>
<span class="s1">DataColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id + parseSelection(selection), selectionArgs);</span>
<span class="s1">deleteData = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unknown URI &quot; </span><span class="s1">+ uri);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(count &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(deleteData) {</span>
<span class="s1">getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">getContext().getContentResolver().notifyChange(uri, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">count;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public int </span><span class="s1">update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {</span>
<span class="s2">int </span><span class="s1">count = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">String id = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">SQLiteDatabase db = mHelper.getWritableDatabase();</span>
<span class="s2">boolean </span><span class="s1">updateData = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">switch </span><span class="s1">(mMatcher.match(uri)) {</span>
<span class="s2">case </span><span class="s1">URI_NOTE:</span>
<span class="s1">increaseNoteVersion(-</span><span class="s4">1</span><span class="s1">, selection, selectionArgs);</span>
<span class="s1">count = db.update(TABLE.NOTE, values, selection, selectionArgs);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_NOTE_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">increaseNoteVersion(Long.valueOf(id), selection, selectionArgs);</span>
<span class="s1">count = db.update(TABLE.NOTE, values, NoteColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id</span>
<span class="s1">+ parseSelection(selection), selectionArgs);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA:</span>
<span class="s1">count = db.update(TABLE.DATA, values, selection, selectionArgs);</span>
<span class="s1">updateData = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">URI_DATA_ITEM:</span>
<span class="s1">id = uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">count = db.update(TABLE.DATA, values, DataColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ id</span>
<span class="s1">+ parseSelection(selection), selectionArgs);</span>
<span class="s1">updateData = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unknown URI &quot; </span><span class="s1">+ uri);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(count &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(updateData) {</span>
<span class="s1">getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">getContext().getContentResolver().notifyChange(uri, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">count;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">String parseSelection(String selection) {</span>
<span class="s2">return </span><span class="s1">(!TextUtils.isEmpty(selection) ? </span><span class="s3">&quot; AND (&quot; </span><span class="s1">+ selection + </span><span class="s3">')' </span><span class="s1">: </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">increaseNoteVersion(</span><span class="s2">long </span><span class="s1">id, String selection, String[] selectionArgs) {</span>
<span class="s1">StringBuilder sql = </span><span class="s2">new </span><span class="s1">StringBuilder(</span><span class="s4">120</span><span class="s1">);</span>
<span class="s1">sql.append(</span><span class="s3">&quot;UPDATE &quot;</span><span class="s1">);</span>
<span class="s1">sql.append(TABLE.NOTE);</span>
<span class="s1">sql.append(</span><span class="s3">&quot; SET &quot;</span><span class="s1">);</span>
<span class="s1">sql.append(NoteColumns.VERSION);</span>
<span class="s1">sql.append(</span><span class="s3">&quot;=&quot; </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s3">&quot;+1 &quot;</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(id &gt; </span><span class="s4">0 </span><span class="s1">|| !TextUtils.isEmpty(selection)) {</span>
<span class="s1">sql.append(</span><span class="s3">&quot; WHERE &quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(id &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">sql.append(NoteColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ String.valueOf(id));</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(selection)) {</span>
<span class="s1">String selectString = id &gt; </span><span class="s4">0 </span><span class="s1">? parseSelection(selection) : selection;</span>
<span class="s2">for </span><span class="s1">(String args : selectionArgs) {</span>
<span class="s1">selectString = selectString.replaceFirst(</span><span class="s3">&quot;</span><span class="s5">\\</span><span class="s3">?&quot;</span><span class="s1">, args);</span>
<span class="s1">}</span>
<span class="s1">sql.append(selectString);</span>
<span class="s1">}</span>
<span class="s1">mHelper.getWritableDatabase().execSQL(sql.toString());</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">String getType(Uri uri) {</span>
<span class="s0">// TODO Auto-generated method stub</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.data</title></head><body><a href="Notes.java.html">Notes.java</a><br /><a href="Contact.java.html">Contact.java</a><br /><a href="NotesProvider.java.html">NotesProvider.java</a><br /><a href="NotesDatabaseHelper.java.html">NotesDatabaseHelper.java</a><br /></body></html>

@ -0,0 +1,102 @@
<html>
<head>
<title>MetaData.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
MetaData.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">public class </span><span class="s1">MetaData </span><span class="s2">extends </span><span class="s1">Task {</span>
<span class="s2">private final static </span><span class="s1">String TAG = MetaData.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private </span><span class="s1">String mRelatedGid = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">public void </span><span class="s1">setMeta(String gid, JSONObject metaInfo) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;failed to put related gid&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">setNotes(metaInfo.toString());</span>
<span class="s1">setName(GTaskStringUtils.META_NOTE_NAME);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getRelatedGid() {</span>
<span class="s2">return </span><span class="s1">mRelatedGid;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">isWorthSaving() {</span>
<span class="s2">return </span><span class="s1">getNotes() != </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">setContentByRemoteJSON(JSONObject js) {</span>
<span class="s2">super</span><span class="s1">.setContentByRemoteJSON(js);</span>
<span class="s2">if </span><span class="s1">(getNotes() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject metaInfo = </span><span class="s2">new </span><span class="s1">JSONObject(getNotes().trim());</span>
<span class="s1">mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;failed to get related gid&quot;</span><span class="s1">);</span>
<span class="s1">mRelatedGid = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">setContentByLocalJSON(JSONObject js) {</span>
<span class="s0">// this function should not be called</span>
<span class="s2">throw new </span><span class="s1">IllegalAccessError(</span><span class="s3">&quot;MetaData:setContentByLocalJSON should not be called&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">JSONObject getLocalJSONFromContent() {</span>
<span class="s2">throw new </span><span class="s1">IllegalAccessError(</span><span class="s3">&quot;MetaData:getLocalJSONFromContent should not be called&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public int </span><span class="s1">getSyncAction(Cursor c) {</span>
<span class="s2">throw new </span><span class="s1">IllegalAccessError(</span><span class="s3">&quot;MetaData:getSyncAction should not be called&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,122 @@
<html>
<head>
<title>Node.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Node.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">public abstract class </span><span class="s1">Node {</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_NONE = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_ADD_REMOTE = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_ADD_LOCAL = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_DEL_REMOTE = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_DEL_LOCAL = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_UPDATE_REMOTE = </span><span class="s3">5</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_UPDATE_LOCAL = </span><span class="s3">6</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_UPDATE_CONFLICT = </span><span class="s3">7</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ACTION_ERROR = </span><span class="s3">8</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">String mGid;</span>
<span class="s2">private </span><span class="s1">String mName;</span>
<span class="s2">private long </span><span class="s1">mLastModified;</span>
<span class="s2">private boolean </span><span class="s1">mDeleted;</span>
<span class="s2">public </span><span class="s1">Node() {</span>
<span class="s1">mGid = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mName = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mLastModified = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mDeleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public abstract </span><span class="s1">JSONObject getCreateAction(</span><span class="s2">int </span><span class="s1">actionId);</span>
<span class="s2">public abstract </span><span class="s1">JSONObject getUpdateAction(</span><span class="s2">int </span><span class="s1">actionId);</span>
<span class="s2">public abstract void </span><span class="s1">setContentByRemoteJSON(JSONObject js);</span>
<span class="s2">public abstract void </span><span class="s1">setContentByLocalJSON(JSONObject js);</span>
<span class="s2">public abstract </span><span class="s1">JSONObject getLocalJSONFromContent();</span>
<span class="s2">public abstract int </span><span class="s1">getSyncAction(Cursor c);</span>
<span class="s2">public void </span><span class="s1">setGid(String gid) {</span>
<span class="s2">this</span><span class="s1">.mGid = gid;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setName(String name) {</span>
<span class="s2">this</span><span class="s1">.mName = name;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setLastModified(</span><span class="s2">long </span><span class="s1">lastModified) {</span>
<span class="s2">this</span><span class="s1">.mLastModified = lastModified;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setDeleted(</span><span class="s2">boolean </span><span class="s1">deleted) {</span>
<span class="s2">this</span><span class="s1">.mDeleted = deleted;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getGid() {</span>
<span class="s2">return this</span><span class="s1">.mGid;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getName() {</span>
<span class="s2">return this</span><span class="s1">.mName;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getLastModified() {</span>
<span class="s2">return this</span><span class="s1">.mLastModified;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">getDeleted() {</span>
<span class="s2">return this</span><span class="s1">.mDeleted;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,210 @@
<html>
<head>
<title>SqlData.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
SqlData.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.NotesDatabaseHelper.TABLE;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">public class </span><span class="s1">SqlData {</span>
<span class="s2">private static final </span><span class="s1">String TAG = SqlData.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private static final int </span><span class="s1">INVALID_ID = -</span><span class="s3">99999</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String[] PROJECTION_DATA = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,</span>
<span class="s1">DataColumns.DATA3</span>
<span class="s1">};</span>
<span class="s2">public static final int </span><span class="s1">DATA_ID_COLUMN = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">DATA_MIME_TYPE_COLUMN = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">DATA_CONTENT_COLUMN = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">DATA_CONTENT_DATA_1_COLUMN = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">DATA_CONTENT_DATA_3_COLUMN = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">ContentResolver mContentResolver;</span>
<span class="s2">private boolean </span><span class="s1">mIsCreate;</span>
<span class="s2">private long </span><span class="s1">mDataId;</span>
<span class="s2">private </span><span class="s1">String mDataMimeType;</span>
<span class="s2">private </span><span class="s1">String mDataContent;</span>
<span class="s2">private long </span><span class="s1">mDataContentData1;</span>
<span class="s2">private </span><span class="s1">String mDataContentData3;</span>
<span class="s2">private </span><span class="s1">ContentValues mDiffDataValues;</span>
<span class="s2">public </span><span class="s1">SqlData(Context context) {</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">mDataId = INVALID_ID;</span>
<span class="s1">mDataMimeType = DataConstants.NOTE;</span>
<span class="s1">mDataContent = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mDataContentData1 = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mDataContentData3 = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mDiffDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">SqlData(Context context, Cursor c) {</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">loadFromCursor(c);</span>
<span class="s1">mDiffDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadFromCursor(Cursor c) {</span>
<span class="s1">mDataId = c.getLong(DATA_ID_COLUMN);</span>
<span class="s1">mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);</span>
<span class="s1">mDataContent = c.getString(DATA_CONTENT_COLUMN);</span>
<span class="s1">mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);</span>
<span class="s1">mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setContent(JSONObject js) </span><span class="s2">throws </span><span class="s1">JSONException {</span>
<span class="s2">long </span><span class="s1">dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mDataId != dataId) {</span>
<span class="s1">mDiffDataValues.put(DataColumns.ID, dataId);</span>
<span class="s1">}</span>
<span class="s1">mDataId = dataId;</span>
<span class="s1">String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)</span>
<span class="s1">: DataConstants.NOTE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mDataMimeType.equals(dataMimeType)) {</span>
<span class="s1">mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);</span>
<span class="s1">}</span>
<span class="s1">mDataMimeType = dataMimeType;</span>
<span class="s1">String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mDataContent.equals(dataContent)) {</span>
<span class="s1">mDiffDataValues.put(DataColumns.CONTENT, dataContent);</span>
<span class="s1">}</span>
<span class="s1">mDataContent = dataContent;</span>
<span class="s2">long </span><span class="s1">dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mDataContentData1 != dataContentData1) {</span>
<span class="s1">mDiffDataValues.put(DataColumns.DATA1, dataContentData1);</span>
<span class="s1">}</span>
<span class="s1">mDataContentData1 = dataContentData1;</span>
<span class="s1">String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mDataContentData3.equals(dataContentData3)) {</span>
<span class="s1">mDiffDataValues.put(DataColumns.DATA3, dataContentData3);</span>
<span class="s1">}</span>
<span class="s1">mDataContentData3 = dataContentData3;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getContent() </span><span class="s2">throws </span><span class="s1">JSONException {</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;it seems that we haven't created this in database yet&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">js.put(DataColumns.ID, mDataId);</span>
<span class="s1">js.put(DataColumns.MIME_TYPE, mDataMimeType);</span>
<span class="s1">js.put(DataColumns.CONTENT, mDataContent);</span>
<span class="s1">js.put(DataColumns.DATA1, mDataContentData1);</span>
<span class="s1">js.put(DataColumns.DATA3, mDataContentData3);</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">commit(</span><span class="s2">long </span><span class="s1">noteId, </span><span class="s2">boolean </span><span class="s1">validateVersion, </span><span class="s2">long </span><span class="s1">version) {</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s2">if </span><span class="s1">(mDataId == INVALID_ID &amp;&amp; mDiffDataValues.containsKey(DataColumns.ID)) {</span>
<span class="s1">mDiffDataValues.remove(DataColumns.ID);</span>
<span class="s1">}</span>
<span class="s1">mDiffDataValues.put(DataColumns.NOTE_ID, noteId);</span>
<span class="s1">Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mDataId = Long.valueOf(uri.getPathSegments().get(</span><span class="s3">1</span><span class="s1">));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;Get note id error :&quot; </span><span class="s1">+ e.toString());</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;create note failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(mDiffDataValues.size() &gt; </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s2">int </span><span class="s1">result = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(!validateVersion) {</span>
<span class="s1">result = mContentResolver.update(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">result = mContentResolver.update(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,</span>
<span class="s4">&quot; ? in (SELECT &quot; </span><span class="s1">+ NoteColumns.ID + </span><span class="s4">&quot; FROM &quot; </span><span class="s1">+ TABLE.NOTE</span>
<span class="s1">+ </span><span class="s4">&quot; WHERE &quot; </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s4">&quot;=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(noteId), String.valueOf(version)</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(result == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;there is no update. maybe user updates note when syncing&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mDiffDataValues.clear();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getId() {</span>
<span class="s2">return </span><span class="s1">mDataId;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,526 @@
<html>
<head>
<title>SqlNote.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
SqlNote.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">import </span><span class="s1">org.json.JSONArray;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">public class </span><span class="s1">SqlNote {</span>
<span class="s2">private static final </span><span class="s1">String TAG = SqlNote.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private static final int </span><span class="s1">INVALID_ID = -</span><span class="s3">99999</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String[] PROJECTION_NOTE = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE,</span>
<span class="s1">NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE,</span>
<span class="s1">NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID,</span>
<span class="s1">NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,</span>
<span class="s1">NoteColumns.VERSION</span>
<span class="s1">};</span>
<span class="s2">public static final int </span><span class="s1">ID_COLUMN = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ALERTED_DATE_COLUMN = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">BG_COLOR_ID_COLUMN = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">CREATED_DATE_COLUMN = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">HAS_ATTACHMENT_COLUMN = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">MODIFIED_DATE_COLUMN = </span><span class="s3">5</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">NOTES_COUNT_COLUMN = </span><span class="s3">6</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">PARENT_ID_COLUMN = </span><span class="s3">7</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SNIPPET_COLUMN = </span><span class="s3">8</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TYPE_COLUMN = </span><span class="s3">9</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">WIDGET_ID_COLUMN = </span><span class="s3">10</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">WIDGET_TYPE_COLUMN = </span><span class="s3">11</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">SYNC_ID_COLUMN = </span><span class="s3">12</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">LOCAL_MODIFIED_COLUMN = </span><span class="s3">13</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">ORIGIN_PARENT_ID_COLUMN = </span><span class="s3">14</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">GTASK_ID_COLUMN = </span><span class="s3">15</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">VERSION_COLUMN = </span><span class="s3">16</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private </span><span class="s1">ContentResolver mContentResolver;</span>
<span class="s2">private boolean </span><span class="s1">mIsCreate;</span>
<span class="s2">private long </span><span class="s1">mId;</span>
<span class="s2">private long </span><span class="s1">mAlertDate;</span>
<span class="s2">private int </span><span class="s1">mBgColorId;</span>
<span class="s2">private long </span><span class="s1">mCreatedDate;</span>
<span class="s2">private int </span><span class="s1">mHasAttachment;</span>
<span class="s2">private long </span><span class="s1">mModifiedDate;</span>
<span class="s2">private long </span><span class="s1">mParentId;</span>
<span class="s2">private </span><span class="s1">String mSnippet;</span>
<span class="s2">private int </span><span class="s1">mType;</span>
<span class="s2">private int </span><span class="s1">mWidgetId;</span>
<span class="s2">private int </span><span class="s1">mWidgetType;</span>
<span class="s2">private long </span><span class="s1">mOriginParent;</span>
<span class="s2">private long </span><span class="s1">mVersion;</span>
<span class="s2">private </span><span class="s1">ContentValues mDiffNoteValues;</span>
<span class="s2">private </span><span class="s1">ArrayList&lt;SqlData&gt; mDataList;</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">mId = INVALID_ID;</span>
<span class="s1">mAlertDate = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mBgColorId = ResourceParser.getDefaultBgId(context);</span>
<span class="s1">mCreatedDate = System.currentTimeMillis();</span>
<span class="s1">mHasAttachment = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mModifiedDate = System.currentTimeMillis();</span>
<span class="s1">mParentId = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mSnippet = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mType = Notes.TYPE_NOTE;</span>
<span class="s1">mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;</span>
<span class="s1">mWidgetType = Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s1">mOriginParent = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mVersion = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context, Cursor c) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">loadFromCursor(c);</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">SqlNote(Context context, </span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = context.getContentResolver();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">loadFromCursor(id);</span>
<span class="s1">mDataList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;SqlData&gt;();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadFromCursor(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, </span><span class="s4">&quot;(_id=?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(id)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.moveToNext();</span>
<span class="s1">loadFromCursor(c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;loadFromCursor: cursor = null&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadFromCursor(Cursor c) {</span>
<span class="s1">mId = c.getLong(ID_COLUMN);</span>
<span class="s1">mAlertDate = c.getLong(ALERTED_DATE_COLUMN);</span>
<span class="s1">mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);</span>
<span class="s1">mCreatedDate = c.getLong(CREATED_DATE_COLUMN);</span>
<span class="s1">mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN);</span>
<span class="s1">mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN);</span>
<span class="s1">mParentId = c.getLong(PARENT_ID_COLUMN);</span>
<span class="s1">mSnippet = c.getString(SNIPPET_COLUMN);</span>
<span class="s1">mType = c.getInt(TYPE_COLUMN);</span>
<span class="s1">mWidgetId = c.getInt(WIDGET_ID_COLUMN);</span>
<span class="s1">mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);</span>
<span class="s1">mVersion = c.getLong(VERSION_COLUMN);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadDataContent() {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mDataList.clear();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,</span>
<span class="s4">&quot;(note_id=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(c.getCount() == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;it seems that the note has not data&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">SqlData data = </span><span class="s2">new </span><span class="s1">SqlData(mContext, c);</span>
<span class="s1">mDataList.add(data);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;loadDataContent: cursor = null&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">setContent(JSONObject js) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s2">if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;cannot set system folder&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {</span>
<span class="s0">// for folder we can only update the snnipet and type</span>
<span class="s1">String snippet = note.has(NoteColumns.SNIPPET) ? note</span>
<span class="s1">.getString(NoteColumns.SNIPPET) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mSnippet.equals(snippet)) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);</span>
<span class="s1">}</span>
<span class="s1">mSnippet = snippet;</span>
<span class="s2">int </span><span class="s1">type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)</span>
<span class="s1">: Notes.TYPE_NOTE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mType != type) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.TYPE, type);</span>
<span class="s1">}</span>
<span class="s1">mType = type;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {</span>
<span class="s1">JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);</span>
<span class="s2">long </span><span class="s1">id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mId != id) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ID, id);</span>
<span class="s1">}</span>
<span class="s1">mId = id;</span>
<span class="s2">long </span><span class="s1">alertDate = note.has(NoteColumns.ALERTED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.ALERTED_DATE) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mAlertDate != alertDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate);</span>
<span class="s1">}</span>
<span class="s1">mAlertDate = alertDate;</span>
<span class="s2">int </span><span class="s1">bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note</span>
<span class="s1">.getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext);</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mBgColorId != bgColorId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId);</span>
<span class="s1">}</span>
<span class="s1">mBgColorId = bgColorId;</span>
<span class="s2">long </span><span class="s1">createDate = note.has(NoteColumns.CREATED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis();</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mCreatedDate != createDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate);</span>
<span class="s1">}</span>
<span class="s1">mCreatedDate = createDate;</span>
<span class="s2">int </span><span class="s1">hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note</span>
<span class="s1">.getInt(NoteColumns.HAS_ATTACHMENT) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mHasAttachment != hasAttachment) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment);</span>
<span class="s1">}</span>
<span class="s1">mHasAttachment = hasAttachment;</span>
<span class="s2">long </span><span class="s1">modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note</span>
<span class="s1">.getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis();</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mModifiedDate != modifiedDate) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate);</span>
<span class="s1">}</span>
<span class="s1">mModifiedDate = modifiedDate;</span>
<span class="s2">long </span><span class="s1">parentId = note.has(NoteColumns.PARENT_ID) ? note</span>
<span class="s1">.getLong(NoteColumns.PARENT_ID) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mParentId != parentId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId);</span>
<span class="s1">}</span>
<span class="s1">mParentId = parentId;</span>
<span class="s1">String snippet = note.has(NoteColumns.SNIPPET) ? note</span>
<span class="s1">.getString(NoteColumns.SNIPPET) : </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || !mSnippet.equals(snippet)) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);</span>
<span class="s1">}</span>
<span class="s1">mSnippet = snippet;</span>
<span class="s2">int </span><span class="s1">type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)</span>
<span class="s1">: Notes.TYPE_NOTE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mType != type) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.TYPE, type);</span>
<span class="s1">}</span>
<span class="s1">mType = type;</span>
<span class="s2">int </span><span class="s1">widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID)</span>
<span class="s1">: AppWidgetManager.INVALID_APPWIDGET_ID;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mWidgetId != widgetId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId);</span>
<span class="s1">}</span>
<span class="s1">mWidgetId = widgetId;</span>
<span class="s2">int </span><span class="s1">widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note</span>
<span class="s1">.getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mWidgetType != widgetType) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType);</span>
<span class="s1">}</span>
<span class="s1">mWidgetType = widgetType;</span>
<span class="s2">long </span><span class="s1">originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note</span>
<span class="s1">.getLong(NoteColumns.ORIGIN_PARENT_ID) : </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mIsCreate || mOriginParent != originParent) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent);</span>
<span class="s1">}</span>
<span class="s1">mOriginParent = originParent;</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; dataArray.length(); i++) {</span>
<span class="s1">JSONObject data = dataArray.getJSONObject(i);</span>
<span class="s1">SqlData sqlData = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(data.has(DataColumns.ID)) {</span>
<span class="s2">long </span><span class="s1">dataId = data.getLong(DataColumns.ID);</span>
<span class="s2">for </span><span class="s1">(SqlData temp : mDataList) {</span>
<span class="s2">if </span><span class="s1">(dataId == temp.getId()) {</span>
<span class="s1">sqlData = temp;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(sqlData == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">sqlData = </span><span class="s2">new </span><span class="s1">SqlData(mContext);</span>
<span class="s1">mDataList.add(sqlData);</span>
<span class="s1">}</span>
<span class="s1">sqlData.setContent(data);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getContent() {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;it seems that we haven't created this in database yet&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">JSONObject note = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s1">note.put(NoteColumns.ID, mId);</span>
<span class="s1">note.put(NoteColumns.ALERTED_DATE, mAlertDate);</span>
<span class="s1">note.put(NoteColumns.BG_COLOR_ID, mBgColorId);</span>
<span class="s1">note.put(NoteColumns.CREATED_DATE, mCreatedDate);</span>
<span class="s1">note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment);</span>
<span class="s1">note.put(NoteColumns.MODIFIED_DATE, mModifiedDate);</span>
<span class="s1">note.put(NoteColumns.PARENT_ID, mParentId);</span>
<span class="s1">note.put(NoteColumns.SNIPPET, mSnippet);</span>
<span class="s1">note.put(NoteColumns.TYPE, mType);</span>
<span class="s1">note.put(NoteColumns.WIDGET_ID, mWidgetId);</span>
<span class="s1">note.put(NoteColumns.WIDGET_TYPE, mWidgetType);</span>
<span class="s1">note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, note);</span>
<span class="s1">JSONArray dataArray = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">JSONObject data = sqlData.getContent();</span>
<span class="s2">if </span><span class="s1">(data != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">dataArray.put(data);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {</span>
<span class="s1">note.put(NoteColumns.ID, mId);</span>
<span class="s1">note.put(NoteColumns.TYPE, mType);</span>
<span class="s1">note.put(NoteColumns.SNIPPET, mSnippet);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, note);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setParentId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mParentId = id;</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.PARENT_ID, id);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setGtaskId(String gid) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setSyncId(</span><span class="s2">long </span><span class="s1">syncId) {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">resetLocalModified() {</span>
<span class="s1">mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s3">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getId() {</span>
<span class="s2">return </span><span class="s1">mId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getParentId() {</span>
<span class="s2">return </span><span class="s1">mParentId;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getSnippet() {</span>
<span class="s2">return </span><span class="s1">mSnippet;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isNoteType() {</span>
<span class="s2">return </span><span class="s1">mType == Notes.TYPE_NOTE;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">commit(</span><span class="s2">boolean </span><span class="s1">validateVersion) {</span>
<span class="s2">if </span><span class="s1">(mIsCreate) {</span>
<span class="s2">if </span><span class="s1">(mId == INVALID_ID &amp;&amp; mDiffNoteValues.containsKey(NoteColumns.ID)) {</span>
<span class="s1">mDiffNoteValues.remove(NoteColumns.ID);</span>
<span class="s1">}</span>
<span class="s1">Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mId = Long.valueOf(uri.getPathSegments().get(</span><span class="s3">1</span><span class="s1">));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;Get note id error :&quot; </span><span class="s1">+ e.toString());</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;create note failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mId == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">&quot;Create thread id failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">sqlData.commit(mId, </span><span class="s2">false</span><span class="s1">, -</span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(mId &lt;= </span><span class="s3">0 </span><span class="s1">&amp;&amp; mId != Notes.ID_ROOT_FOLDER &amp;&amp; mId != Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;No such note&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">&quot;Try to update note with invalid id&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mDiffNoteValues.size() &gt; </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">mVersion ++;</span>
<span class="s2">int </span><span class="s1">result = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(!validateVersion) {</span>
<span class="s1">result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, </span><span class="s4">&quot;(&quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s4">&quot;=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId)</span>
<span class="s1">});</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, </span><span class="s4">&quot;(&quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s4">&quot;=?) AND (&quot; </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s4">&quot;&lt;=?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mId), String.valueOf(mVersion)</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(result == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;there is no update. maybe user updates note when syncing&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE) {</span>
<span class="s2">for </span><span class="s1">(SqlData sqlData : mDataList) {</span>
<span class="s1">sqlData.commit(mId, validateVersion, mVersion);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// refresh local info</span>
<span class="s1">loadFromCursor(mId);</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE)</span>
<span class="s1">loadDataContent();</span>
<span class="s1">mDiffNoteValues.clear();</span>
<span class="s1">mIsCreate = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,372 @@
<html>
<head>
<title>Task.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Task.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">org.json.JSONArray;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">public class </span><span class="s1">Task </span><span class="s2">extends </span><span class="s1">Node {</span>
<span class="s2">private static final </span><span class="s1">String TAG = Task.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private boolean </span><span class="s1">mCompleted;</span>
<span class="s2">private </span><span class="s1">String mNotes;</span>
<span class="s2">private </span><span class="s1">JSONObject mMetaInfo;</span>
<span class="s2">private </span><span class="s1">Task mPriorSibling;</span>
<span class="s2">private </span><span class="s1">TaskList mParent;</span>
<span class="s2">public </span><span class="s1">Task() {</span>
<span class="s2">super</span><span class="s1">();</span>
<span class="s1">mCompleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mNotes = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mPriorSibling = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mParent = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mMetaInfo = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getCreateAction(</span><span class="s2">int </span><span class="s1">actionId) {</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// action_type</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);</span>
<span class="s0">// action_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);</span>
<span class="s0">// index</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(</span><span class="s2">this</span><span class="s1">));</span>
<span class="s0">// entity_delta</span>
<span class="s1">JSONObject entity = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, </span><span class="s3">&quot;null&quot;</span><span class="s1">);</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_TYPE_TASK);</span>
<span class="s2">if </span><span class="s1">(getNotes() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());</span>
<span class="s1">}</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);</span>
<span class="s0">// parent_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid());</span>
<span class="s0">// dest_parent_type</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_TYPE_GROUP);</span>
<span class="s0">// list_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid());</span>
<span class="s0">// prior_sibling_id</span>
<span class="s2">if </span><span class="s1">(mPriorSibling != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid());</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;fail to generate task-create jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getUpdateAction(</span><span class="s2">int </span><span class="s1">actionId) {</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// action_type</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);</span>
<span class="s0">// action_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);</span>
<span class="s0">// id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());</span>
<span class="s0">// entity_delta</span>
<span class="s1">JSONObject entity = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());</span>
<span class="s2">if </span><span class="s1">(getNotes() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());</span>
<span class="s1">}</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;fail to generate task-update jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setContentByRemoteJSON(JSONObject js) {</span>
<span class="s2">if </span><span class="s1">(js != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// id</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_ID)) {</span>
<span class="s1">setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));</span>
<span class="s1">}</span>
<span class="s0">// last_modified</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {</span>
<span class="s1">setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));</span>
<span class="s1">}</span>
<span class="s0">// name</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_NAME)) {</span>
<span class="s1">setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));</span>
<span class="s1">}</span>
<span class="s0">// notes</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_NOTES)) {</span>
<span class="s1">setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES));</span>
<span class="s1">}</span>
<span class="s0">// deleted</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_DELETED)) {</span>
<span class="s1">setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED));</span>
<span class="s1">}</span>
<span class="s0">// completed</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) {</span>
<span class="s1">setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED));</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;fail to get task content from jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setContentByLocalJSON(JSONObject js) {</span>
<span class="s2">if </span><span class="s1">(js == </span><span class="s2">null </span><span class="s1">|| !js.has(GTaskStringUtils.META_HEAD_NOTE)</span>
<span class="s1">|| !js.has(GTaskStringUtils.META_HEAD_DATA)) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;setContentByLocalJSON: nothing is avaiable&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s1">JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);</span>
<span class="s2">if </span><span class="s1">(note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;invalid type&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; dataArray.length(); i++) {</span>
<span class="s1">JSONObject data = dataArray.getJSONObject(i);</span>
<span class="s2">if </span><span class="s1">(TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {</span>
<span class="s1">setName(data.getString(DataColumns.CONTENT));</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getLocalJSONFromContent() {</span>
<span class="s1">String name = getName();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(mMetaInfo == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s0">// new task created from web</span>
<span class="s2">if </span><span class="s1">(name == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;the note seems to be an empty one&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONObject note = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray dataArray = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s1">JSONObject data = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">data.put(DataColumns.CONTENT, name);</span>
<span class="s1">dataArray.put(data);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);</span>
<span class="s1">note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, note);</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// synced task</span>
<span class="s1">JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s1">JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; dataArray.length(); i++) {</span>
<span class="s1">JSONObject data = dataArray.getJSONObject(i);</span>
<span class="s2">if </span><span class="s1">(TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {</span>
<span class="s1">data.put(DataColumns.CONTENT, getName());</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);</span>
<span class="s2">return </span><span class="s1">mMetaInfo;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setMetaInfo(MetaData metaData) {</span>
<span class="s2">if </span><span class="s1">(metaData != </span><span class="s2">null </span><span class="s1">&amp;&amp; metaData.getNotes() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mMetaInfo = </span><span class="s2">new </span><span class="s1">JSONObject(metaData.getNotes());</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.w(TAG, e.toString());</span>
<span class="s1">mMetaInfo = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getSyncAction(Cursor c) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject noteInfo = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mMetaInfo != </span><span class="s2">null </span><span class="s1">&amp;&amp; mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) {</span>
<span class="s1">noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(noteInfo == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;it seems that note meta has been deleted&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_REMOTE;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!noteInfo.has(NoteColumns.ID)) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;remote note id seems to be deleted&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_LOCAL;</span>
<span class="s1">}</span>
<span class="s0">// validate the note id now</span>
<span class="s2">if </span><span class="s1">(c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;note id doesn't match&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_LOCAL;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s0">// there is no local update</span>
<span class="s2">if </span><span class="s1">(c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {</span>
<span class="s0">// no update both side</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_NONE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// apply remote to local</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_LOCAL;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// validate gtask id</span>
<span class="s2">if </span><span class="s1">(!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;gtask id doesn't match&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_ERROR;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {</span>
<span class="s0">// local modification only</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_REMOTE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_CONFLICT;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_ERROR;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isWorthSaving() {</span>
<span class="s2">return </span><span class="s1">mMetaInfo != </span><span class="s2">null </span><span class="s1">|| (getName() != </span><span class="s2">null </span><span class="s1">&amp;&amp; getName().trim().length() &gt; </span><span class="s4">0</span><span class="s1">)</span>
<span class="s1">|| (getNotes() != </span><span class="s2">null </span><span class="s1">&amp;&amp; getNotes().trim().length() &gt; </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCompleted(</span><span class="s2">boolean </span><span class="s1">completed) {</span>
<span class="s2">this</span><span class="s1">.mCompleted = completed;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setNotes(String notes) {</span>
<span class="s2">this</span><span class="s1">.mNotes = notes;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setPriorSibling(Task priorSibling) {</span>
<span class="s2">this</span><span class="s1">.mPriorSibling = priorSibling;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setParent(TaskList parent) {</span>
<span class="s2">this</span><span class="s1">.mParent = parent;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">getCompleted() {</span>
<span class="s2">return this</span><span class="s1">.mCompleted;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getNotes() {</span>
<span class="s2">return this</span><span class="s1">.mNotes;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Task getPriorSibling() {</span>
<span class="s2">return this</span><span class="s1">.mPriorSibling;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">TaskList getParent() {</span>
<span class="s2">return this</span><span class="s1">.mParent;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,364 @@
<html>
<head>
<title>TaskList.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
TaskList.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.data;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">public class </span><span class="s1">TaskList </span><span class="s2">extends </span><span class="s1">Node {</span>
<span class="s2">private static final </span><span class="s1">String TAG = TaskList.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private int </span><span class="s1">mIndex;</span>
<span class="s2">private </span><span class="s1">ArrayList&lt;Task&gt; mChildren;</span>
<span class="s2">public </span><span class="s1">TaskList() {</span>
<span class="s2">super</span><span class="s1">();</span>
<span class="s1">mChildren = </span><span class="s2">new </span><span class="s1">ArrayList&lt;Task&gt;();</span>
<span class="s1">mIndex = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getCreateAction(</span><span class="s2">int </span><span class="s1">actionId) {</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// action_type</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);</span>
<span class="s0">// action_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);</span>
<span class="s0">// index</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex);</span>
<span class="s0">// entity_delta</span>
<span class="s1">JSONObject entity = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, </span><span class="s4">&quot;null&quot;</span><span class="s1">);</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_TYPE_GROUP);</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;fail to generate tasklist-create jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getUpdateAction(</span><span class="s2">int </span><span class="s1">actionId) {</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// action_type</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);</span>
<span class="s0">// action_id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);</span>
<span class="s0">// id</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());</span>
<span class="s0">// entity_delta</span>
<span class="s1">JSONObject entity = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());</span>
<span class="s1">entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());</span>
<span class="s1">js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;fail to generate tasklist-update jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setContentByRemoteJSON(JSONObject js) {</span>
<span class="s2">if </span><span class="s1">(js != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s0">// id</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_ID)) {</span>
<span class="s1">setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));</span>
<span class="s1">}</span>
<span class="s0">// last_modified</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {</span>
<span class="s1">setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));</span>
<span class="s1">}</span>
<span class="s0">// name</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.GTASK_JSON_NAME)) {</span>
<span class="s1">setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;fail to get tasklist content from jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setContentByLocalJSON(JSONObject js) {</span>
<span class="s2">if </span><span class="s1">(js == </span><span class="s2">null </span><span class="s1">|| !js.has(GTaskStringUtils.META_HEAD_NOTE)) {</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;setContentByLocalJSON: nothing is avaiable&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s2">if </span><span class="s1">(folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {</span>
<span class="s1">String name = folder.getString(NoteColumns.SNIPPET);</span>
<span class="s1">setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {</span>
<span class="s2">if </span><span class="s1">(folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER)</span>
<span class="s1">setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT);</span>
<span class="s2">else if </span><span class="s1">(folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER)</span>
<span class="s1">setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX</span>
<span class="s1">+ GTaskStringUtils.FOLDER_CALL_NOTE);</span>
<span class="s2">else</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;invalid system folder&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;error type&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONObject getLocalJSONFromContent() {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONObject folder = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">String folderName = getName();</span>
<span class="s2">if </span><span class="s1">(getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX))</span>
<span class="s1">folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(),</span>
<span class="s1">folderName.length());</span>
<span class="s1">folder.put(NoteColumns.SNIPPET, folderName);</span>
<span class="s2">if </span><span class="s1">(folderName.equals(GTaskStringUtils.FOLDER_DEFAULT)</span>
<span class="s1">|| folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE))</span>
<span class="s1">folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);</span>
<span class="s2">else</span>
<span class="s1">folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);</span>
<span class="s1">js.put(GTaskStringUtils.META_HEAD_NOTE, folder);</span>
<span class="s2">return </span><span class="s1">js;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getSyncAction(Cursor c) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s0">// there is no local update</span>
<span class="s2">if </span><span class="s1">(c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {</span>
<span class="s0">// no update both side</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_NONE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// apply remote to local</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_LOCAL;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// validate gtask id</span>
<span class="s2">if </span><span class="s1">(!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;gtask id doesn't match&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_ERROR;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {</span>
<span class="s0">// local modification only</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_REMOTE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// for folder conflicts, just apply local modification</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_UPDATE_REMOTE;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">SYNC_ACTION_ERROR;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getChildTaskCount() {</span>
<span class="s2">return </span><span class="s1">mChildren.size();</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">addChildTask(Task task) {</span>
<span class="s2">boolean </span><span class="s1">ret = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(task != </span><span class="s2">null </span><span class="s1">&amp;&amp; !mChildren.contains(task)) {</span>
<span class="s1">ret = mChildren.add(task);</span>
<span class="s2">if </span><span class="s1">(ret) {</span>
<span class="s0">// need to set prior sibling and parent</span>
<span class="s1">task.setPriorSibling(mChildren.isEmpty() ? </span><span class="s2">null </span><span class="s1">: mChildren</span>
<span class="s1">.get(mChildren.size() - </span><span class="s3">1</span><span class="s1">));</span>
<span class="s1">task.setParent(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">ret;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">addChildTask(Task task, </span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s2">if </span><span class="s1">(index &lt; </span><span class="s3">0 </span><span class="s1">|| index &gt; mChildren.size()) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;add child task: invalid index&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">int </span><span class="s1">pos = mChildren.indexOf(task);</span>
<span class="s2">if </span><span class="s1">(task != </span><span class="s2">null </span><span class="s1">&amp;&amp; pos == -</span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">mChildren.add(index, task);</span>
<span class="s0">// update the task list</span>
<span class="s1">Task preTask = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">Task afterTask = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(index != </span><span class="s3">0</span><span class="s1">)</span>
<span class="s1">preTask = mChildren.get(index - </span><span class="s3">1</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(index != mChildren.size() - </span><span class="s3">1</span><span class="s1">)</span>
<span class="s1">afterTask = mChildren.get(index + </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">task.setPriorSibling(preTask);</span>
<span class="s2">if </span><span class="s1">(afterTask != </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">afterTask.setPriorSibling(task);</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">removeChildTask(Task task) {</span>
<span class="s2">boolean </span><span class="s1">ret = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">int </span><span class="s1">index = mChildren.indexOf(task);</span>
<span class="s2">if </span><span class="s1">(index != -</span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">ret = mChildren.remove(task);</span>
<span class="s2">if </span><span class="s1">(ret) {</span>
<span class="s0">// reset prior sibling and parent</span>
<span class="s1">task.setPriorSibling(</span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">task.setParent(</span><span class="s2">null</span><span class="s1">);</span>
<span class="s0">// update the task list</span>
<span class="s2">if </span><span class="s1">(index != mChildren.size()) {</span>
<span class="s1">mChildren.get(index).setPriorSibling(</span>
<span class="s1">index == </span><span class="s3">0 </span><span class="s1">? </span><span class="s2">null </span><span class="s1">: mChildren.get(index - </span><span class="s3">1</span><span class="s1">));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">ret;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">moveChildTask(Task task, </span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s2">if </span><span class="s1">(index &lt; </span><span class="s3">0 </span><span class="s1">|| index &gt;= mChildren.size()) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;move child task: invalid index&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">int </span><span class="s1">pos = mChildren.indexOf(task);</span>
<span class="s2">if </span><span class="s1">(pos == -</span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;move child task: the task should in the list&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(pos == index)</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s2">return </span><span class="s1">(removeChildTask(task) &amp;&amp; addChildTask(task, index));</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Task findChildTaskByGid(String gid) {</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; mChildren.size(); i++) {</span>
<span class="s1">Task t = mChildren.get(i);</span>
<span class="s2">if </span><span class="s1">(t.getGid().equals(gid)) {</span>
<span class="s2">return </span><span class="s1">t;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getChildTaskIndex(Task task) {</span>
<span class="s2">return </span><span class="s1">mChildren.indexOf(task);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Task getChildTaskByIndex(</span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s2">if </span><span class="s1">(index &lt; </span><span class="s3">0 </span><span class="s1">|| index &gt;= mChildren.size()) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;getTaskByIndex: invalid index&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mChildren.get(index);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Task getChilTaskByGid(String gid) {</span>
<span class="s2">for </span><span class="s1">(Task task : mChildren) {</span>
<span class="s2">if </span><span class="s1">(task.getGid().equals(gid))</span>
<span class="s2">return </span><span class="s1">task;</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">ArrayList&lt;Task&gt; getChildTaskList() {</span>
<span class="s2">return this</span><span class="s1">.mChildren;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setIndex(</span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s2">this</span><span class="s1">.mIndex = index;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getIndex() {</span>
<span class="s2">return this</span><span class="s1">.mIndex;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.gtask.data</title></head><body><a href="Node.java.html">Node.java</a><br /><a href="Task.java.html">Task.java</a><br /><a href="SqlData.java.html">SqlData.java</a><br /><a href="SqlNote.java.html">SqlNote.java</a><br /><a href="MetaData.java.html">MetaData.java</a><br /><a href="TaskList.java.html">TaskList.java</a><br /></body></html>

@ -0,0 +1,53 @@
<html>
<head>
<title>ActionFailureException.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ActionFailureException.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.exception;</span>
<span class="s2">public class </span><span class="s1">ActionFailureException </span><span class="s2">extends </span><span class="s1">RuntimeException {</span>
<span class="s2">private static final long </span><span class="s1">serialVersionUID = </span><span class="s3">4425249765923293627L</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">ActionFailureException() {</span>
<span class="s2">super</span><span class="s1">();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">ActionFailureException(String paramString) {</span>
<span class="s2">super</span><span class="s1">(paramString);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">ActionFailureException(String paramString, Throwable paramThrowable) {</span>
<span class="s2">super</span><span class="s1">(paramString, paramThrowable);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,53 @@
<html>
<head>
<title>NetworkFailureException.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NetworkFailureException.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.exception;</span>
<span class="s2">public class </span><span class="s1">NetworkFailureException </span><span class="s2">extends </span><span class="s1">Exception {</span>
<span class="s2">private static final long </span><span class="s1">serialVersionUID = </span><span class="s3">2107610287180234136L</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">NetworkFailureException() {</span>
<span class="s2">super</span><span class="s1">();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">NetworkFailureException(String paramString) {</span>
<span class="s2">super</span><span class="s1">(paramString);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">NetworkFailureException(String paramString, Throwable paramThrowable) {</span>
<span class="s2">super</span><span class="s1">(paramString, paramThrowable);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.gtask.exception</title></head><body><a href="ActionFailureException.java.html">ActionFailureException.java</a><br /><a href="NetworkFailureException.java.html">NetworkFailureException.java</a><br /></body></html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.gtask</title></head><body><a href="data/index.html"><b>data</b></a><br /><a href="remote/index.html"><b>remote</b></a><br /><a href="exception/index.html"><b>exception</b></a><br /></body></html>

@ -0,0 +1,144 @@
<html>
<head>
<title>GTaskASyncTask.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808;}
.s1 { color: #8c8c8c; font-style: italic;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
GTaskASyncTask.java</font>
</center></td></tr></table>
<pre>
<span class="s1">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s0">net.micode.notes.gtask.remote;</span>
<span class="s2">import </span><span class="s0">android.app.Notification;</span>
<span class="s2">import </span><span class="s0">android.app.NotificationManager;</span>
<span class="s2">import </span><span class="s0">android.app.PendingIntent;</span>
<span class="s2">import </span><span class="s0">android.content.Context;</span>
<span class="s2">import </span><span class="s0">android.content.Intent;</span>
<span class="s2">import </span><span class="s0">android.os.AsyncTask;</span>
<span class="s2">import </span><span class="s0">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s0">net.micode.notes.ui.NotesListActivity;</span>
<span class="s2">import </span><span class="s0">net.micode.notes.ui.NotesPreferenceActivity;</span>
<span class="s2">public class </span><span class="s0">GTaskASyncTask </span><span class="s2">extends </span><span class="s0">AsyncTask&lt;Void, String, Integer&gt; {</span>
<span class="s2">private static int </span><span class="s0">GTASK_SYNC_NOTIFICATION_ID = </span><span class="s3">5234235</span><span class="s0">;</span>
<span class="s2">public interface </span><span class="s0">OnCompleteListener {</span>
<span class="s2">void </span><span class="s0">onComplete();</span>
<span class="s0">}</span>
<span class="s2">private </span><span class="s0">Context mContext;</span>
<span class="s2">private </span><span class="s0">NotificationManager mNotifiManager;</span>
<span class="s2">private </span><span class="s0">GTaskManager mTaskManager;</span>
<span class="s2">private </span><span class="s0">OnCompleteListener mOnCompleteListener;</span>
<span class="s2">public </span><span class="s0">GTaskASyncTask(Context context, OnCompleteListener listener) {</span>
<span class="s0">mContext = context;</span>
<span class="s0">mOnCompleteListener = listener;</span>
<span class="s0">mNotifiManager = (NotificationManager) mContext</span>
<span class="s0">.getSystemService(Context.NOTIFICATION_SERVICE);</span>
<span class="s0">mTaskManager = GTaskManager.getInstance();</span>
<span class="s0">}</span>
<span class="s2">public void </span><span class="s0">cancelSync() {</span>
<span class="s0">mTaskManager.cancelSync();</span>
<span class="s0">}</span>
<span class="s2">public void </span><span class="s0">publishProgess(String message) {</span>
<span class="s0">publishProgress(</span><span class="s2">new </span><span class="s0">String[]{</span>
<span class="s0">message</span>
<span class="s0">});</span>
<span class="s0">}</span>
<span class="s2">private void </span><span class="s0">showNotification(</span><span class="s2">int </span><span class="s0">tickerId, String content) {</span>
<span class="s0">PendingIntent pendingIntent;</span>
<span class="s2">if </span><span class="s0">(tickerId != R.string.ticker_success) {</span>
<span class="s0">pendingIntent = PendingIntent.getActivity(mContext, </span><span class="s3">0</span><span class="s0">, </span><span class="s2">new </span><span class="s0">Intent(mContext,</span>
<span class="s0">NotesPreferenceActivity.</span><span class="s2">class</span><span class="s0">), PendingIntent.FLAG_IMMUTABLE);</span>
<span class="s0">} </span><span class="s2">else </span><span class="s0">{</span>
<span class="s0">pendingIntent = PendingIntent.getActivity(mContext, </span><span class="s3">0</span><span class="s0">, </span><span class="s2">new </span><span class="s0">Intent(mContext,</span>
<span class="s0">NotesListActivity.</span><span class="s2">class</span><span class="s0">), PendingIntent.FLAG_IMMUTABLE);</span>
<span class="s0">}</span>
<span class="s0">Notification.Builder builder = </span><span class="s2">new </span><span class="s0">Notification.Builder(mContext)</span>
<span class="s0">.setAutoCancel(</span><span class="s2">true</span><span class="s0">)</span>
<span class="s0">.setContentTitle(mContext.getString(R.string.app_name))</span>
<span class="s0">.setContentText(content)</span>
<span class="s0">.setContentIntent(pendingIntent)</span>
<span class="s0">.setWhen(System.currentTimeMillis())</span>
<span class="s0">.setOngoing(</span><span class="s2">true</span><span class="s0">);</span>
<span class="s0">Notification notification = builder.getNotification();</span>
<span class="s0">mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);</span>
<span class="s0">}</span>
<span class="s0">@Override</span>
<span class="s2">protected </span><span class="s0">Integer doInBackground(Void... unused) {</span>
<span class="s0">publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity</span>
<span class="s0">.getSyncAccountName(mContext)));</span>
<span class="s2">return </span><span class="s0">mTaskManager.sync(mContext, </span><span class="s2">this</span><span class="s0">);</span>
<span class="s0">}</span>
<span class="s0">@Override</span>
<span class="s2">protected void </span><span class="s0">onProgressUpdate(String... progress) {</span>
<span class="s0">showNotification(R.string.ticker_syncing, progress[</span><span class="s3">0</span><span class="s0">]);</span>
<span class="s2">if </span><span class="s0">(mContext </span><span class="s2">instanceof </span><span class="s0">GTaskSyncService) {</span>
<span class="s0">((GTaskSyncService) mContext).sendBroadcast(progress[</span><span class="s3">0</span><span class="s0">]);</span>
<span class="s0">}</span>
<span class="s0">}</span>
<span class="s0">@Override</span>
<span class="s2">protected void </span><span class="s0">onPostExecute(Integer result) {</span>
<span class="s2">if </span><span class="s0">(result == GTaskManager.STATE_SUCCESS) {</span>
<span class="s0">showNotification(R.string.ticker_success, mContext.getString(</span>
<span class="s0">R.string.success_sync_account, mTaskManager.getSyncAccount()));</span>
<span class="s0">NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());</span>
<span class="s0">} </span><span class="s2">else if </span><span class="s0">(result == GTaskManager.STATE_NETWORK_ERROR) {</span>
<span class="s0">showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));</span>
<span class="s0">} </span><span class="s2">else if </span><span class="s0">(result == GTaskManager.STATE_INTERNAL_ERROR) {</span>
<span class="s0">showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));</span>
<span class="s0">} </span><span class="s2">else if </span><span class="s0">(result == GTaskManager.STATE_SYNC_CANCELLED) {</span>
<span class="s0">showNotification(R.string.ticker_cancel, mContext</span>
<span class="s0">.getString(R.string.error_sync_cancelled));</span>
<span class="s0">}</span>
<span class="s2">if </span><span class="s0">(mOnCompleteListener != </span><span class="s2">null</span><span class="s0">) {</span>
<span class="s2">new </span><span class="s0">Thread(</span><span class="s2">new </span><span class="s0">Runnable() {</span>
<span class="s2">public void </span><span class="s0">run() {</span>
<span class="s0">mOnCompleteListener.onComplete();</span>
<span class="s0">}</span>
<span class="s0">}).start();</span>
<span class="s0">}</span>
<span class="s0">}</span>
<span class="s0">}</span>
</pre>
</body>
</html>

@ -0,0 +1,606 @@
<html>
<head>
<title>GTaskClient.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
GTaskClient.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.remote;</span>
<span class="s2">import </span><span class="s1">android.accounts.Account;</span>
<span class="s2">import </span><span class="s1">android.accounts.AccountManager;</span>
<span class="s2">import </span><span class="s1">android.accounts.AccountManagerFuture;</span>
<span class="s2">import </span><span class="s1">android.app.Activity;</span>
<span class="s2">import </span><span class="s1">android.os.Bundle;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.Node;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.Task;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.TaskList;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.NetworkFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NotesPreferenceActivity;</span>
<span class="s2">import </span><span class="s1">org.apache.http.HttpEntity;</span>
<span class="s2">import </span><span class="s1">org.apache.http.HttpResponse;</span>
<span class="s2">import </span><span class="s1">org.apache.http.client.ClientProtocolException;</span>
<span class="s2">import </span><span class="s1">org.apache.http.client.entity.UrlEncodedFormEntity;</span>
<span class="s2">import </span><span class="s1">org.apache.http.client.methods.HttpGet;</span>
<span class="s2">import </span><span class="s1">org.apache.http.client.methods.HttpPost;</span>
<span class="s2">import </span><span class="s1">org.apache.http.cookie.Cookie;</span>
<span class="s2">import </span><span class="s1">org.apache.http.impl.client.BasicCookieStore;</span>
<span class="s2">import </span><span class="s1">org.apache.http.impl.client.DefaultHttpClient;</span>
<span class="s2">import </span><span class="s1">org.apache.http.message.BasicNameValuePair;</span>
<span class="s2">import </span><span class="s1">org.apache.http.params.BasicHttpParams;</span>
<span class="s2">import </span><span class="s1">org.apache.http.params.HttpConnectionParams;</span>
<span class="s2">import </span><span class="s1">org.apache.http.params.HttpParams;</span>
<span class="s2">import </span><span class="s1">org.apache.http.params.HttpProtocolParams;</span>
<span class="s2">import </span><span class="s1">org.json.JSONArray;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">import </span><span class="s1">java.io.BufferedReader;</span>
<span class="s2">import </span><span class="s1">java.io.IOException;</span>
<span class="s2">import </span><span class="s1">java.io.InputStream;</span>
<span class="s2">import </span><span class="s1">java.io.InputStreamReader;</span>
<span class="s2">import </span><span class="s1">java.util.LinkedList;</span>
<span class="s2">import </span><span class="s1">java.util.List;</span>
<span class="s2">import </span><span class="s1">java.util.zip.GZIPInputStream;</span>
<span class="s2">import </span><span class="s1">java.util.zip.Inflater;</span>
<span class="s2">import </span><span class="s1">java.util.zip.InflaterInputStream;</span>
<span class="s2">public class </span><span class="s1">GTaskClient {</span>
<span class="s2">private static final </span><span class="s1">String TAG = GTaskClient.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">private static final </span><span class="s1">String GTASK_URL = </span><span class="s3">&quot;https://mail.google.com/tasks/&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String GTASK_GET_URL = </span><span class="s3">&quot;https://mail.google.com/tasks/ig&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String GTASK_POST_URL = </span><span class="s3">&quot;https://mail.google.com/tasks/r/ig&quot;</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">GTaskClient mInstance = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">DefaultHttpClient mHttpClient;</span>
<span class="s2">private </span><span class="s1">String mGetUrl;</span>
<span class="s2">private </span><span class="s1">String mPostUrl;</span>
<span class="s2">private long </span><span class="s1">mClientVersion;</span>
<span class="s2">private boolean </span><span class="s1">mLoggedin;</span>
<span class="s2">private long </span><span class="s1">mLastLoginTime;</span>
<span class="s2">private int </span><span class="s1">mActionId;</span>
<span class="s2">private </span><span class="s1">Account mAccount;</span>
<span class="s2">private </span><span class="s1">JSONArray mUpdateArray;</span>
<span class="s2">private </span><span class="s1">GTaskClient() {</span>
<span class="s1">mHttpClient = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mGetUrl = GTASK_GET_URL;</span>
<span class="s1">mPostUrl = GTASK_POST_URL;</span>
<span class="s1">mClientVersion = -</span><span class="s4">1</span><span class="s1">;</span>
<span class="s1">mLoggedin = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mLastLoginTime = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mActionId = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s1">mAccount = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mUpdateArray = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static synchronized </span><span class="s1">GTaskClient getInstance() {</span>
<span class="s2">if </span><span class="s1">(mInstance == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mInstance = </span><span class="s2">new </span><span class="s1">GTaskClient();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mInstance;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">login(Activity activity) {</span>
<span class="s0">// we suppose that the cookie would expire after 5 minutes</span>
<span class="s0">// then we need to re-login</span>
<span class="s2">final long </span><span class="s1">interval = </span><span class="s4">1000 </span><span class="s1">* </span><span class="s4">60 </span><span class="s1">* </span><span class="s4">5</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mLastLoginTime + interval &lt; System.currentTimeMillis()) {</span>
<span class="s1">mLoggedin = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// need to re-login after account switch</span>
<span class="s2">if </span><span class="s1">(mLoggedin</span>
<span class="s1">&amp;&amp; !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity</span>
<span class="s1">.getSyncAccountName(activity))) {</span>
<span class="s1">mLoggedin = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mLoggedin) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;already logged in&quot;</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mLastLoginTime = System.currentTimeMillis();</span>
<span class="s1">String authToken = loginGoogleAccount(activity, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(authToken == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;login google account failed&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// login with custom domain if necessary</span>
<span class="s2">if </span><span class="s1">(!(mAccount.name.toLowerCase().endsWith(</span><span class="s3">&quot;gmail.com&quot;</span><span class="s1">) || mAccount.name.toLowerCase()</span>
<span class="s1">.endsWith(</span><span class="s3">&quot;googlemail.com&quot;</span><span class="s1">))) {</span>
<span class="s1">StringBuilder url = </span><span class="s2">new </span><span class="s1">StringBuilder(GTASK_URL).append(</span><span class="s3">&quot;a/&quot;</span><span class="s1">);</span>
<span class="s2">int </span><span class="s1">index = mAccount.name.indexOf(</span><span class="s3">'@'</span><span class="s1">) + </span><span class="s4">1</span><span class="s1">;</span>
<span class="s1">String suffix = mAccount.name.substring(index);</span>
<span class="s1">url.append(suffix + </span><span class="s3">&quot;/&quot;</span><span class="s1">);</span>
<span class="s1">mGetUrl = url.toString() + </span><span class="s3">&quot;ig&quot;</span><span class="s1">;</span>
<span class="s1">mPostUrl = url.toString() + </span><span class="s3">&quot;r/ig&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(tryToLoginGtask(activity, authToken)) {</span>
<span class="s1">mLoggedin = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// try to login with google official url</span>
<span class="s2">if </span><span class="s1">(!mLoggedin) {</span>
<span class="s1">mGetUrl = GTASK_GET_URL;</span>
<span class="s1">mPostUrl = GTASK_POST_URL;</span>
<span class="s2">if </span><span class="s1">(!tryToLoginGtask(activity, authToken)) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mLoggedin = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">String loginGoogleAccount(Activity activity, </span><span class="s2">boolean </span><span class="s1">invalidateToken) {</span>
<span class="s1">String authToken;</span>
<span class="s1">AccountManager accountManager = AccountManager.get(activity);</span>
<span class="s1">Account[] accounts = accountManager.getAccountsByType(</span><span class="s3">&quot;com.google&quot;</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(accounts.length == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;there is no available google account&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">String accountName = NotesPreferenceActivity.getSyncAccountName(activity);</span>
<span class="s1">Account account = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(Account a : accounts) {</span>
<span class="s2">if </span><span class="s1">(a.name.equals(accountName)) {</span>
<span class="s1">account = a;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(account != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mAccount = account;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;unable to get an account with the same name in the settings&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// get the token now</span>
<span class="s1">AccountManagerFuture&lt;Bundle&gt; accountManagerFuture = accountManager.getAuthToken(account,</span>
<span class="s3">&quot;goanna_mobile&quot;</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, activity, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">Bundle authTokenBundle = accountManagerFuture.getResult();</span>
<span class="s1">authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);</span>
<span class="s2">if </span><span class="s1">(invalidateToken) {</span>
<span class="s1">accountManager.invalidateAuthToken(</span><span class="s3">&quot;com.google&quot;</span><span class="s1">, authToken);</span>
<span class="s1">loginGoogleAccount(activity, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;get auth token failed&quot;</span><span class="s1">);</span>
<span class="s1">authToken = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">authToken;</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">tryToLoginGtask(Activity activity, String authToken) {</span>
<span class="s2">if </span><span class="s1">(!loginGtask(authToken)) {</span>
<span class="s0">// maybe the auth token is out of date, now let's invalidate the</span>
<span class="s0">// token and try again</span>
<span class="s1">authToken = loginGoogleAccount(activity, </span><span class="s2">true</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(authToken == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;login google account failed&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!loginGtask(authToken)) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;login gtask failed&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">loginGtask(String authToken) {</span>
<span class="s2">int </span><span class="s1">timeoutConnection = </span><span class="s4">10000</span><span class="s1">;</span>
<span class="s2">int </span><span class="s1">timeoutSocket = </span><span class="s4">15000</span><span class="s1">;</span>
<span class="s1">HttpParams httpParameters = </span><span class="s2">new </span><span class="s1">BasicHttpParams();</span>
<span class="s1">HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);</span>
<span class="s1">HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);</span>
<span class="s1">mHttpClient = </span><span class="s2">new </span><span class="s1">DefaultHttpClient(httpParameters);</span>
<span class="s1">BasicCookieStore localBasicCookieStore = </span><span class="s2">new </span><span class="s1">BasicCookieStore();</span>
<span class="s1">mHttpClient.setCookieStore(localBasicCookieStore);</span>
<span class="s1">HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), </span><span class="s2">false</span><span class="s1">);</span>
<span class="s0">// login gtask</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">String loginUrl = mGetUrl + </span><span class="s3">&quot;?auth=&quot; </span><span class="s1">+ authToken;</span>
<span class="s1">HttpGet httpGet = </span><span class="s2">new </span><span class="s1">HttpGet(loginUrl);</span>
<span class="s1">HttpResponse response = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">response = mHttpClient.execute(httpGet);</span>
<span class="s0">// get the cookie now</span>
<span class="s1">List&lt;Cookie&gt; cookies = mHttpClient.getCookieStore().getCookies();</span>
<span class="s2">boolean </span><span class="s1">hasAuthCookie = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(Cookie cookie : cookies) {</span>
<span class="s2">if </span><span class="s1">(cookie.getName().contains(</span><span class="s3">&quot;GTL&quot;</span><span class="s1">)) {</span>
<span class="s1">hasAuthCookie = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!hasAuthCookie) {</span>
<span class="s1">Log.w(TAG, </span><span class="s3">&quot;it seems that there is no auth cookie&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s0">// get the client version</span>
<span class="s1">String resString = getResponseContent(response.getEntity());</span>
<span class="s1">String jsBegin = </span><span class="s3">&quot;_setup(&quot;</span><span class="s1">;</span>
<span class="s1">String jsEnd = </span><span class="s3">&quot;)}&lt;/script&gt;&quot;</span><span class="s1">;</span>
<span class="s2">int </span><span class="s1">begin = resString.indexOf(jsBegin);</span>
<span class="s2">int </span><span class="s1">end = resString.lastIndexOf(jsEnd);</span>
<span class="s1">String jsString = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(begin != -</span><span class="s4">1 </span><span class="s1">&amp;&amp; end != -</span><span class="s4">1 </span><span class="s1">&amp;&amp; begin &lt; end) {</span>
<span class="s1">jsString = resString.substring(begin + jsBegin.length(), end);</span>
<span class="s1">}</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject(jsString);</span>
<span class="s1">mClientVersion = js.getLong(</span><span class="s3">&quot;v&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s0">// simply catch all exceptions</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;httpget gtask_url failed&quot;</span><span class="s1">);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private int </span><span class="s1">getActionId() {</span>
<span class="s2">return </span><span class="s1">mActionId++;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">HttpPost createHttpPost() {</span>
<span class="s1">HttpPost httpPost = </span><span class="s2">new </span><span class="s1">HttpPost(mPostUrl);</span>
<span class="s1">httpPost.setHeader(</span><span class="s3">&quot;Content-Type&quot;</span><span class="s1">, </span><span class="s3">&quot;application/x-www-form-urlencoded;charset=utf-8&quot;</span><span class="s1">);</span>
<span class="s1">httpPost.setHeader(</span><span class="s3">&quot;AT&quot;</span><span class="s1">, </span><span class="s3">&quot;1&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">httpPost;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">String getResponseContent(HttpEntity entity) </span><span class="s2">throws </span><span class="s1">IOException {</span>
<span class="s1">String contentEncoding = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(entity.getContentEncoding() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">contentEncoding = entity.getContentEncoding().getValue();</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;encoding: &quot; </span><span class="s1">+ contentEncoding);</span>
<span class="s1">}</span>
<span class="s1">InputStream input = entity.getContent();</span>
<span class="s2">if </span><span class="s1">(contentEncoding != </span><span class="s2">null </span><span class="s1">&amp;&amp; contentEncoding.equalsIgnoreCase(</span><span class="s3">&quot;gzip&quot;</span><span class="s1">)) {</span>
<span class="s1">input = </span><span class="s2">new </span><span class="s1">GZIPInputStream(entity.getContent());</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(contentEncoding != </span><span class="s2">null </span><span class="s1">&amp;&amp; contentEncoding.equalsIgnoreCase(</span><span class="s3">&quot;deflate&quot;</span><span class="s1">)) {</span>
<span class="s1">Inflater inflater = </span><span class="s2">new </span><span class="s1">Inflater(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">input = </span><span class="s2">new </span><span class="s1">InflaterInputStream(entity.getContent(), inflater);</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">InputStreamReader isr = </span><span class="s2">new </span><span class="s1">InputStreamReader(input);</span>
<span class="s1">BufferedReader br = </span><span class="s2">new </span><span class="s1">BufferedReader(isr);</span>
<span class="s1">StringBuilder sb = </span><span class="s2">new </span><span class="s1">StringBuilder();</span>
<span class="s2">while </span><span class="s1">(</span><span class="s2">true</span><span class="s1">) {</span>
<span class="s1">String buff = br.readLine();</span>
<span class="s2">if </span><span class="s1">(buff == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">return </span><span class="s1">sb.toString();</span>
<span class="s1">}</span>
<span class="s1">sb = sb.append(buff);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s1">input.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">JSONObject postRequest(JSONObject js) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(!mLoggedin) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;please login first&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;not logged in&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">HttpPost httpPost = createHttpPost();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">LinkedList&lt;BasicNameValuePair&gt; list = </span><span class="s2">new </span><span class="s1">LinkedList&lt;BasicNameValuePair&gt;();</span>
<span class="s1">list.add(</span><span class="s2">new </span><span class="s1">BasicNameValuePair(</span><span class="s3">&quot;r&quot;</span><span class="s1">, js.toString()));</span>
<span class="s1">UrlEncodedFormEntity entity = </span><span class="s2">new </span><span class="s1">UrlEncodedFormEntity(list, </span><span class="s3">&quot;UTF-8&quot;</span><span class="s1">);</span>
<span class="s1">httpPost.setEntity(entity);</span>
<span class="s0">// execute the post</span>
<span class="s1">HttpResponse response = mHttpClient.execute(httpPost);</span>
<span class="s1">String jsString = getResponseContent(response.getEntity());</span>
<span class="s2">return new </span><span class="s1">JSONObject(jsString);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(ClientProtocolException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">NetworkFailureException(</span><span class="s3">&quot;postRequest failed&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IOException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">NetworkFailureException(</span><span class="s3">&quot;postRequest failed&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;unable to convert response content to jsonobject&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;error occurs when posting request&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createTask(Task task) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">commitUpdate();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray actionList = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s0">// action_list</span>
<span class="s1">actionList.put(task.getCreateAction(getActionId()));</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);</span>
<span class="s0">// client_version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s0">// post</span>
<span class="s1">JSONObject jsResponse = postRequest(jsPost);</span>
<span class="s1">JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_RESULTS).get(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;create task: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">createTaskList(TaskList tasklist) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">commitUpdate();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray actionList = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s0">// action_list</span>
<span class="s1">actionList.put(tasklist.getCreateAction(getActionId()));</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);</span>
<span class="s0">// client version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s0">// post</span>
<span class="s1">JSONObject jsResponse = postRequest(jsPost);</span>
<span class="s1">JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_RESULTS).get(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;create tasklist: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">commitUpdate() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mUpdateArray != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s0">// action_list</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray);</span>
<span class="s0">// client_version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s1">postRequest(jsPost);</span>
<span class="s1">mUpdateArray = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;commit update: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">addUpdateNode(Node node) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s0">// too many update items may result in an error</span>
<span class="s0">// set max to 10 items</span>
<span class="s2">if </span><span class="s1">(mUpdateArray != </span><span class="s2">null </span><span class="s1">&amp;&amp; mUpdateArray.length() &gt; </span><span class="s4">10</span><span class="s1">) {</span>
<span class="s1">commitUpdate();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mUpdateArray == </span><span class="s2">null</span><span class="s1">)</span>
<span class="s1">mUpdateArray = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s1">mUpdateArray.put(node.getUpdateAction(getActionId()));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">moveTask(Task task, TaskList preParent, TaskList curParent)</span>
<span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">commitUpdate();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray actionList = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s1">JSONObject action = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s0">// action_list</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE);</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid());</span>
<span class="s2">if </span><span class="s1">(preParent == curParent &amp;&amp; task.getPriorSibling() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s0">// put prioring_sibing_id only if moving within the tasklist and</span>
<span class="s0">// it is not the first one</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());</span>
<span class="s1">}</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid());</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid());</span>
<span class="s2">if </span><span class="s1">(preParent != curParent) {</span>
<span class="s0">// put the dest_list only if moving between tasklists</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());</span>
<span class="s1">}</span>
<span class="s1">actionList.put(action);</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);</span>
<span class="s0">// client_version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s1">postRequest(jsPost);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;move task: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">deleteNode(Node node) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">commitUpdate();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray actionList = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s0">// action_list</span>
<span class="s1">node.setDeleted(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">actionList.put(node.getUpdateAction(getActionId()));</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);</span>
<span class="s0">// client_version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s1">postRequest(jsPost);</span>
<span class="s1">mUpdateArray = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;delete node: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONArray getTaskLists() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(!mLoggedin) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;please login first&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;not logged in&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">HttpGet httpGet = </span><span class="s2">new </span><span class="s1">HttpGet(mGetUrl);</span>
<span class="s1">HttpResponse response = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">response = mHttpClient.execute(httpGet);</span>
<span class="s0">// get the task list</span>
<span class="s1">String resString = getResponseContent(response.getEntity());</span>
<span class="s1">String jsBegin = </span><span class="s3">&quot;_setup(&quot;</span><span class="s1">;</span>
<span class="s1">String jsEnd = </span><span class="s3">&quot;)}&lt;/script&gt;&quot;</span><span class="s1">;</span>
<span class="s2">int </span><span class="s1">begin = resString.indexOf(jsBegin);</span>
<span class="s2">int </span><span class="s1">end = resString.lastIndexOf(jsEnd);</span>
<span class="s1">String jsString = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(begin != -</span><span class="s4">1 </span><span class="s1">&amp;&amp; end != -</span><span class="s4">1 </span><span class="s1">&amp;&amp; begin &lt; end) {</span>
<span class="s1">jsString = resString.substring(begin + jsBegin.length(), end);</span>
<span class="s1">}</span>
<span class="s1">JSONObject js = </span><span class="s2">new </span><span class="s1">JSONObject(jsString);</span>
<span class="s2">return </span><span class="s1">js.getJSONObject(</span><span class="s3">&quot;t&quot;</span><span class="s1">).getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(ClientProtocolException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">NetworkFailureException(</span><span class="s3">&quot;gettasklists: httpget failed&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IOException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">NetworkFailureException(</span><span class="s3">&quot;gettasklists: httpget failed&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;get task lists: handing jasonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">JSONArray getTaskList(String listGid) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">commitUpdate();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONObject jsPost = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s1">JSONArray actionList = </span><span class="s2">new </span><span class="s1">JSONArray();</span>
<span class="s1">JSONObject action = </span><span class="s2">new </span><span class="s1">JSONObject();</span>
<span class="s0">// action_list</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,</span>
<span class="s1">GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL);</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid);</span>
<span class="s1">action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">actionList.put(action);</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);</span>
<span class="s0">// client_version</span>
<span class="s1">jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);</span>
<span class="s1">JSONObject jsResponse = postRequest(jsPost);</span>
<span class="s2">return </span><span class="s1">jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">&quot;get task list: handing jsonobject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Account getSyncAccount() {</span>
<span class="s2">return </span><span class="s1">mAccount;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">resetUpdateArray() {</span>
<span class="s1">mUpdateArray = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,821 @@
<html>
<head>
<title>GTaskManager.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
GTaskManager.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.remote;</span>
<span class="s2">import </span><span class="s1">android.app.Activity;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.MetaData;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.Node;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.SqlNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.Task;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.data.TaskList;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.ActionFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.exception.NetworkFailureException;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.DataUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.GTaskStringUtils;</span>
<span class="s2">import </span><span class="s1">org.json.JSONArray;</span>
<span class="s2">import </span><span class="s1">org.json.JSONException;</span>
<span class="s2">import </span><span class="s1">org.json.JSONObject;</span>
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
<span class="s2">import </span><span class="s1">java.util.HashSet;</span>
<span class="s2">import </span><span class="s1">java.util.Iterator;</span>
<span class="s2">import </span><span class="s1">java.util.Map;</span>
<span class="s2">public class </span><span class="s1">GTaskManager {</span>
<span class="s2">private static final </span><span class="s1">String TAG = GTaskManager.</span><span class="s2">class</span><span class="s1">.getSimpleName();</span>
<span class="s2">public static final int </span><span class="s1">STATE_SUCCESS = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">STATE_NETWORK_ERROR = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">STATE_INTERNAL_ERROR = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">STATE_SYNC_IN_PROGRESS = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">STATE_SYNC_CANCELLED = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">GTaskManager mInstance = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">Activity mActivity;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private </span><span class="s1">ContentResolver mContentResolver;</span>
<span class="s2">private boolean </span><span class="s1">mSyncing;</span>
<span class="s2">private boolean </span><span class="s1">mCancelled;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;String, TaskList&gt; mGTaskListHashMap;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;String, Node&gt; mGTaskHashMap;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;String, MetaData&gt; mMetaHashMap;</span>
<span class="s2">private </span><span class="s1">TaskList mMetaList;</span>
<span class="s2">private </span><span class="s1">HashSet&lt;Long&gt; mLocalDeleteIdMap;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;String, Long&gt; mGidToNid;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;Long, String&gt; mNidToGid;</span>
<span class="s2">private </span><span class="s1">GTaskManager() {</span>
<span class="s1">mSyncing = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mCancelled = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mGTaskListHashMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, TaskList&gt;();</span>
<span class="s1">mGTaskHashMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, Node&gt;();</span>
<span class="s1">mMetaHashMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, MetaData&gt;();</span>
<span class="s1">mMetaList = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">mLocalDeleteIdMap = </span><span class="s2">new </span><span class="s1">HashSet&lt;Long&gt;();</span>
<span class="s1">mGidToNid = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, Long&gt;();</span>
<span class="s1">mNidToGid = </span><span class="s2">new </span><span class="s1">HashMap&lt;Long, String&gt;();</span>
<span class="s1">}</span>
<span class="s2">public static synchronized </span><span class="s1">GTaskManager getInstance() {</span>
<span class="s2">if </span><span class="s1">(mInstance == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mInstance = </span><span class="s2">new </span><span class="s1">GTaskManager();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mInstance;</span>
<span class="s1">}</span>
<span class="s2">public synchronized void </span><span class="s1">setActivityContext(Activity activity) {</span>
<span class="s0">// used for getting authtoken</span>
<span class="s1">mActivity = activity;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">sync(Context context, GTaskASyncTask asyncTask) {</span>
<span class="s2">if </span><span class="s1">(mSyncing) {</span>
<span class="s1">Log.d(TAG, </span><span class="s4">&quot;Sync is in progress&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">STATE_SYNC_IN_PROGRESS;</span>
<span class="s1">}</span>
<span class="s1">mContext = context;</span>
<span class="s1">mContentResolver = mContext.getContentResolver();</span>
<span class="s1">mSyncing = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">mCancelled = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mGTaskListHashMap.clear();</span>
<span class="s1">mGTaskHashMap.clear();</span>
<span class="s1">mMetaHashMap.clear();</span>
<span class="s1">mLocalDeleteIdMap.clear();</span>
<span class="s1">mGidToNid.clear();</span>
<span class="s1">mNidToGid.clear();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">GTaskClient client = GTaskClient.getInstance();</span>
<span class="s1">client.resetUpdateArray();</span>
<span class="s0">// login google task</span>
<span class="s2">if </span><span class="s1">(!mCancelled) {</span>
<span class="s2">if </span><span class="s1">(!client.login(mActivity)) {</span>
<span class="s2">throw new </span><span class="s1">NetworkFailureException(</span><span class="s4">&quot;login google task failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// get the task list from google</span>
<span class="s1">asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list));</span>
<span class="s1">initGTaskList();</span>
<span class="s0">// do content sync work</span>
<span class="s1">asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));</span>
<span class="s1">syncContent();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NetworkFailureException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s2">return </span><span class="s1">STATE_NETWORK_ERROR;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(ActionFailureException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s2">return </span><span class="s1">STATE_INTERNAL_ERROR;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(Exception e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return </span><span class="s1">STATE_INTERNAL_ERROR;</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s1">mGTaskListHashMap.clear();</span>
<span class="s1">mGTaskHashMap.clear();</span>
<span class="s1">mMetaHashMap.clear();</span>
<span class="s1">mLocalDeleteIdMap.clear();</span>
<span class="s1">mGidToNid.clear();</span>
<span class="s1">mNidToGid.clear();</span>
<span class="s1">mSyncing = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">initGTaskList() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled)</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">GTaskClient client = GTaskClient.getInstance();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">JSONArray jsTaskLists = client.getTaskLists();</span>
<span class="s0">// init meta list first</span>
<span class="s1">mMetaList = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; jsTaskLists.length(); i++) {</span>
<span class="s1">JSONObject object = jsTaskLists.getJSONObject(i);</span>
<span class="s1">String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);</span>
<span class="s1">String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);</span>
<span class="s2">if </span><span class="s1">(name</span>
<span class="s1">.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {</span>
<span class="s1">mMetaList = </span><span class="s2">new </span><span class="s1">TaskList();</span>
<span class="s1">mMetaList.setContentByRemoteJSON(object);</span>
<span class="s0">// load meta data</span>
<span class="s1">JSONArray jsMetas = client.getTaskList(gid);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">j = </span><span class="s3">0</span><span class="s1">; j &lt; jsMetas.length(); j++) {</span>
<span class="s1">object = (JSONObject) jsMetas.getJSONObject(j);</span>
<span class="s1">MetaData metaData = </span><span class="s2">new </span><span class="s1">MetaData();</span>
<span class="s1">metaData.setContentByRemoteJSON(object);</span>
<span class="s2">if </span><span class="s1">(metaData.isWorthSaving()) {</span>
<span class="s1">mMetaList.addChildTask(metaData);</span>
<span class="s2">if </span><span class="s1">(metaData.getGid() != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mMetaHashMap.put(metaData.getRelatedGid(), metaData);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// create meta list if not existed</span>
<span class="s2">if </span><span class="s1">(mMetaList == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mMetaList = </span><span class="s2">new </span><span class="s1">TaskList();</span>
<span class="s1">mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX</span>
<span class="s1">+ GTaskStringUtils.FOLDER_META);</span>
<span class="s1">GTaskClient.getInstance().createTaskList(mMetaList);</span>
<span class="s1">}</span>
<span class="s0">// init task list</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; jsTaskLists.length(); i++) {</span>
<span class="s1">JSONObject object = jsTaskLists.getJSONObject(i);</span>
<span class="s1">String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);</span>
<span class="s1">String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);</span>
<span class="s2">if </span><span class="s1">(name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)</span>
<span class="s1">&amp;&amp; !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX</span>
<span class="s1">+ GTaskStringUtils.FOLDER_META)) {</span>
<span class="s1">TaskList tasklist = </span><span class="s2">new </span><span class="s1">TaskList();</span>
<span class="s1">tasklist.setContentByRemoteJSON(object);</span>
<span class="s1">mGTaskListHashMap.put(gid, tasklist);</span>
<span class="s1">mGTaskHashMap.put(gid, tasklist);</span>
<span class="s0">// load tasks</span>
<span class="s1">JSONArray jsTasks = client.getTaskList(gid);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">j = </span><span class="s3">0</span><span class="s1">; j &lt; jsTasks.length(); j++) {</span>
<span class="s1">object = (JSONObject) jsTasks.getJSONObject(j);</span>
<span class="s1">gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);</span>
<span class="s1">Task task = </span><span class="s2">new </span><span class="s1">Task();</span>
<span class="s1">task.setContentByRemoteJSON(object);</span>
<span class="s2">if </span><span class="s1">(task.isWorthSaving()) {</span>
<span class="s1">task.setMetaInfo(mMetaHashMap.get(gid));</span>
<span class="s1">tasklist.addChildTask(task);</span>
<span class="s1">mGTaskHashMap.put(gid, task);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;initGTaskList: handing JSONObject failed&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">syncContent() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">int </span><span class="s1">syncType;</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">String gid;</span>
<span class="s1">Node node;</span>
<span class="s1">mLocalDeleteIdMap.clear();</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// for local deleted note</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,</span>
<span class="s4">&quot;(type&lt;&gt;? AND parent_id=?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c);</span>
<span class="s1">}</span>
<span class="s1">mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query trash folder&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// sync folder first</span>
<span class="s1">syncFolder();</span>
<span class="s0">// for note existing in database</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,</span>
<span class="s4">&quot;(type=? AND parent_id&lt;&gt;?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER)</span>
<span class="s1">}, NoteColumns.TYPE + </span><span class="s4">&quot; DESC&quot;</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));</span>
<span class="s1">mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);</span>
<span class="s1">syncType = node.getSyncAction(c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s0">// local add</span>
<span class="s1">syncType = Node.SYNC_ACTION_ADD_REMOTE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// remote delete</span>
<span class="s1">syncType = Node.SYNC_ACTION_DEL_LOCAL;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">doContentSync(syncType, node, c);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query existing note in database&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// go through remaining items</span>
<span class="s1">Iterator&lt;Map.Entry&lt;String, Node&gt;&gt; iter = mGTaskHashMap.entrySet().iterator();</span>
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
<span class="s1">Map.Entry&lt;String, Node&gt; entry = iter.next();</span>
<span class="s1">node = entry.getValue();</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s0">// mCancelled can be set by another thread, so we neet to check one by</span>
<span class="s0">// one</span>
<span class="s0">// clear local delete table</span>
<span class="s2">if </span><span class="s1">(!mCancelled) {</span>
<span class="s2">if </span><span class="s1">(!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) {</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;failed to batch-delete local deleted notes&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// refresh local sync id</span>
<span class="s2">if </span><span class="s1">(!mCancelled) {</span>
<span class="s1">GTaskClient.getInstance().commitUpdate();</span>
<span class="s1">refreshLocalSyncId();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">syncFolder() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">String gid;</span>
<span class="s1">Node node;</span>
<span class="s2">int </span><span class="s1">syncType;</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// for root folder</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.moveToNext();</span>
<span class="s1">gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">mGidToNid.put(gid, (</span><span class="s2">long</span><span class="s1">) Notes.ID_ROOT_FOLDER);</span>
<span class="s1">mNidToGid.put((</span><span class="s2">long</span><span class="s1">) Notes.ID_ROOT_FOLDER, gid);</span>
<span class="s0">// for system folder, only update remote name if necessary</span>
<span class="s2">if </span><span class="s1">(!node.getName().equals(</span>
<span class="s1">GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT))</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query root folder&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// for call-note folder</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, </span><span class="s4">&quot;(_id=?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(Notes.ID_CALL_RECORD_FOLDER)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">mGidToNid.put(gid, (</span><span class="s2">long</span><span class="s1">) Notes.ID_CALL_RECORD_FOLDER);</span>
<span class="s1">mNidToGid.put((</span><span class="s2">long</span><span class="s1">) Notes.ID_CALL_RECORD_FOLDER, gid);</span>
<span class="s0">// for system folder, only update remote name if</span>
<span class="s0">// necessary</span>
<span class="s2">if </span><span class="s1">(!node.getName().equals(</span>
<span class="s1">GTaskStringUtils.MIUI_FOLDER_PREFFIX</span>
<span class="s1">+ GTaskStringUtils.FOLDER_CALL_NOTE))</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query call note folder&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// for local existing folders</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,</span>
<span class="s4">&quot;(type=? AND parent_id&lt;&gt;?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)</span>
<span class="s1">}, NoteColumns.TYPE + </span><span class="s4">&quot; DESC&quot;</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));</span>
<span class="s1">mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);</span>
<span class="s1">syncType = node.getSyncAction(c);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s0">// local add</span>
<span class="s1">syncType = Node.SYNC_ACTION_ADD_REMOTE;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// remote delete</span>
<span class="s1">syncType = Node.SYNC_ACTION_DEL_LOCAL;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">doContentSync(syncType, node, c);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query existing folder&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// for remote add folders</span>
<span class="s1">Iterator&lt;Map.Entry&lt;String, TaskList&gt;&gt; iter = mGTaskListHashMap.entrySet().iterator();</span>
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
<span class="s1">Map.Entry&lt;String, TaskList&gt; entry = iter.next();</span>
<span class="s1">gid = entry.getKey();</span>
<span class="s1">node = entry.getValue();</span>
<span class="s2">if </span><span class="s1">(mGTaskHashMap.containsKey(gid)) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!mCancelled)</span>
<span class="s1">GTaskClient.getInstance().commitUpdate();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">doContentSync(</span><span class="s2">int </span><span class="s1">syncType, Node node, Cursor c) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">MetaData meta;</span>
<span class="s2">switch </span><span class="s1">(syncType) {</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_ADD_LOCAL:</span>
<span class="s1">addLocalNode(node);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_ADD_REMOTE:</span>
<span class="s1">addRemoteNode(node, c);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_DEL_LOCAL:</span>
<span class="s1">meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN));</span>
<span class="s2">if </span><span class="s1">(meta != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">GTaskClient.getInstance().deleteNode(meta);</span>
<span class="s1">}</span>
<span class="s1">mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_DEL_REMOTE:</span>
<span class="s1">meta = mMetaHashMap.get(node.getGid());</span>
<span class="s2">if </span><span class="s1">(meta != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">GTaskClient.getInstance().deleteNode(meta);</span>
<span class="s1">}</span>
<span class="s1">GTaskClient.getInstance().deleteNode(node);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_UPDATE_LOCAL:</span>
<span class="s1">updateLocalNode(node, c);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_UPDATE_REMOTE:</span>
<span class="s1">updateRemoteNode(node, c);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_UPDATE_CONFLICT:</span>
<span class="s0">// merging both modifications maybe a good idea</span>
<span class="s0">// right now just use local update simply</span>
<span class="s1">updateRemoteNode(node, c);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_NONE:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">Node.SYNC_ACTION_ERROR:</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;unkown sync action type&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">addLocalNode(Node node) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">SqlNote sqlNote;</span>
<span class="s2">if </span><span class="s1">(node </span><span class="s2">instanceof </span><span class="s1">TaskList) {</span>
<span class="s2">if </span><span class="s1">(node.getName().equals(</span>
<span class="s1">GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) {</span>
<span class="s1">sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext, Notes.ID_ROOT_FOLDER);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(node.getName().equals(</span>
<span class="s1">GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) {</span>
<span class="s1">sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext);</span>
<span class="s1">sqlNote.setContent(node.getLocalJSONFromContent());</span>
<span class="s1">sqlNote.setParentId(Notes.ID_ROOT_FOLDER);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext);</span>
<span class="s1">JSONObject js = node.getLocalJSONFromContent();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.META_HEAD_NOTE)) {</span>
<span class="s1">JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);</span>
<span class="s2">if </span><span class="s1">(note.has(NoteColumns.ID)) {</span>
<span class="s2">long </span><span class="s1">id = note.getLong(NoteColumns.ID);</span>
<span class="s2">if </span><span class="s1">(DataUtils.existInNoteDatabase(mContentResolver, id)) {</span>
<span class="s0">// the id is not available, have to create a new one</span>
<span class="s1">note.remove(NoteColumns.ID);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(js.has(GTaskStringUtils.META_HEAD_DATA)) {</span>
<span class="s1">JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; dataArray.length(); i++) {</span>
<span class="s1">JSONObject data = dataArray.getJSONObject(i);</span>
<span class="s2">if </span><span class="s1">(data.has(DataColumns.ID)) {</span>
<span class="s2">long </span><span class="s1">dataId = data.getLong(DataColumns.ID);</span>
<span class="s2">if </span><span class="s1">(DataUtils.existInDataDatabase(mContentResolver, dataId)) {</span>
<span class="s0">// the data id is not available, have to create</span>
<span class="s0">// a new one</span>
<span class="s1">data.remove(DataColumns.ID);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(JSONException e) {</span>
<span class="s1">Log.w(TAG, e.toString());</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s1">sqlNote.setContent(js);</span>
<span class="s1">Long parentId = mGidToNid.get(((Task) node).getParent().getGid());</span>
<span class="s2">if </span><span class="s1">(parentId == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;cannot find task's parent id locally&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;cannot add local node&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">sqlNote.setParentId(parentId.longValue());</span>
<span class="s1">}</span>
<span class="s0">// create the local node</span>
<span class="s1">sqlNote.setGtaskId(node.getGid());</span>
<span class="s1">sqlNote.commit(</span><span class="s2">false</span><span class="s1">);</span>
<span class="s0">// update gid-nid mapping</span>
<span class="s1">mGidToNid.put(node.getGid(), sqlNote.getId());</span>
<span class="s1">mNidToGid.put(sqlNote.getId(), node.getGid());</span>
<span class="s0">// update meta</span>
<span class="s1">updateRemoteMeta(node.getGid(), sqlNote);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateLocalNode(Node node, Cursor c) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">SqlNote sqlNote;</span>
<span class="s0">// update the note locally</span>
<span class="s1">sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext, c);</span>
<span class="s1">sqlNote.setContent(node.getLocalJSONFromContent());</span>
<span class="s1">Long parentId = (node </span><span class="s2">instanceof </span><span class="s1">Task) ? mGidToNid.get(((Task) node).getParent().getGid())</span>
<span class="s1">: </span><span class="s2">new </span><span class="s1">Long(Notes.ID_ROOT_FOLDER);</span>
<span class="s2">if </span><span class="s1">(parentId == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;cannot find task's parent id locally&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;cannot update local node&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">sqlNote.setParentId(parentId.longValue());</span>
<span class="s1">sqlNote.commit(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s0">// update meta info</span>
<span class="s1">updateRemoteMeta(node.getGid(), sqlNote);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">addRemoteNode(Node node, Cursor c) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">SqlNote sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext, c);</span>
<span class="s1">Node n;</span>
<span class="s0">// update remotely</span>
<span class="s2">if </span><span class="s1">(sqlNote.isNoteType()) {</span>
<span class="s1">Task task = </span><span class="s2">new </span><span class="s1">Task();</span>
<span class="s1">task.setContentByLocalJSON(sqlNote.getContent());</span>
<span class="s1">String parentGid = mNidToGid.get(sqlNote.getParentId());</span>
<span class="s2">if </span><span class="s1">(parentGid == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;cannot find task's parent tasklist&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;cannot add remote task&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mGTaskListHashMap.get(parentGid).addChildTask(task);</span>
<span class="s1">GTaskClient.getInstance().createTask(task);</span>
<span class="s1">n = (Node) task;</span>
<span class="s0">// add meta</span>
<span class="s1">updateRemoteMeta(task.getGid(), sqlNote);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">TaskList tasklist = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s0">// we need to skip folder if it has already existed</span>
<span class="s1">String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;</span>
<span class="s2">if </span><span class="s1">(sqlNote.getId() == Notes.ID_ROOT_FOLDER)</span>
<span class="s1">folderName += GTaskStringUtils.FOLDER_DEFAULT;</span>
<span class="s2">else if </span><span class="s1">(sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER)</span>
<span class="s1">folderName += GTaskStringUtils.FOLDER_CALL_NOTE;</span>
<span class="s2">else</span>
<span class="s1">folderName += sqlNote.getSnippet();</span>
<span class="s1">Iterator&lt;Map.Entry&lt;String, TaskList&gt;&gt; iter = mGTaskListHashMap.entrySet().iterator();</span>
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
<span class="s1">Map.Entry&lt;String, TaskList&gt; entry = iter.next();</span>
<span class="s1">String gid = entry.getKey();</span>
<span class="s1">TaskList list = entry.getValue();</span>
<span class="s2">if </span><span class="s1">(list.getName().equals(folderName)) {</span>
<span class="s1">tasklist = list;</span>
<span class="s2">if </span><span class="s1">(mGTaskHashMap.containsKey(gid)) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// no match we can add now</span>
<span class="s2">if </span><span class="s1">(tasklist == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">tasklist = </span><span class="s2">new </span><span class="s1">TaskList();</span>
<span class="s1">tasklist.setContentByLocalJSON(sqlNote.getContent());</span>
<span class="s1">GTaskClient.getInstance().createTaskList(tasklist);</span>
<span class="s1">mGTaskListHashMap.put(tasklist.getGid(), tasklist);</span>
<span class="s1">}</span>
<span class="s1">n = (Node) tasklist;</span>
<span class="s1">}</span>
<span class="s0">// update local note</span>
<span class="s1">sqlNote.setGtaskId(n.getGid());</span>
<span class="s1">sqlNote.commit(</span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">sqlNote.resetLocalModified();</span>
<span class="s1">sqlNote.commit(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s0">// gid-id mapping</span>
<span class="s1">mGidToNid.put(n.getGid(), sqlNote.getId());</span>
<span class="s1">mNidToGid.put(sqlNote.getId(), n.getGid());</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateRemoteNode(Node node, Cursor c) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">SqlNote sqlNote = </span><span class="s2">new </span><span class="s1">SqlNote(mContext, c);</span>
<span class="s0">// update remotely</span>
<span class="s1">node.setContentByLocalJSON(sqlNote.getContent());</span>
<span class="s1">GTaskClient.getInstance().addUpdateNode(node);</span>
<span class="s0">// update meta</span>
<span class="s1">updateRemoteMeta(node.getGid(), sqlNote);</span>
<span class="s0">// move task if necessary</span>
<span class="s2">if </span><span class="s1">(sqlNote.isNoteType()) {</span>
<span class="s1">Task task = (Task) node;</span>
<span class="s1">TaskList preParentList = task.getParent();</span>
<span class="s1">String curParentGid = mNidToGid.get(sqlNote.getParentId());</span>
<span class="s2">if </span><span class="s1">(curParentGid == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;cannot find task's parent tasklist&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">&quot;cannot update remote task&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">TaskList curParentList = mGTaskListHashMap.get(curParentGid);</span>
<span class="s2">if </span><span class="s1">(preParentList != curParentList) {</span>
<span class="s1">preParentList.removeChildTask(task);</span>
<span class="s1">curParentList.addChildTask(task);</span>
<span class="s1">GTaskClient.getInstance().moveTask(task, preParentList, curParentList);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">// clear local modified flag</span>
<span class="s1">sqlNote.resetLocalModified();</span>
<span class="s1">sqlNote.commit(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateRemoteMeta(String gid, SqlNote sqlNote) </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(sqlNote != </span><span class="s2">null </span><span class="s1">&amp;&amp; sqlNote.isNoteType()) {</span>
<span class="s1">MetaData metaData = mMetaHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(metaData != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">metaData.setMeta(gid, sqlNote.getContent());</span>
<span class="s1">GTaskClient.getInstance().addUpdateNode(metaData);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">metaData = </span><span class="s2">new </span><span class="s1">MetaData();</span>
<span class="s1">metaData.setMeta(gid, sqlNote.getContent());</span>
<span class="s1">mMetaList.addChildTask(metaData);</span>
<span class="s1">mMetaHashMap.put(gid, metaData);</span>
<span class="s1">GTaskClient.getInstance().createTask(metaData);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">refreshLocalSyncId() </span><span class="s2">throws </span><span class="s1">NetworkFailureException {</span>
<span class="s2">if </span><span class="s1">(mCancelled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">// get the latest gtask list</span>
<span class="s1">mGTaskHashMap.clear();</span>
<span class="s1">mGTaskListHashMap.clear();</span>
<span class="s1">mMetaHashMap.clear();</span>
<span class="s1">initGTaskList();</span>
<span class="s1">Cursor c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,</span>
<span class="s4">&quot;(type&lt;&gt;? AND parent_id&lt;&gt;?)&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)</span>
<span class="s1">}, NoteColumns.TYPE + </span><span class="s4">&quot; DESC&quot;</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">while </span><span class="s1">(c.moveToNext()) {</span>
<span class="s1">String gid = c.getString(SqlNote.GTASK_ID_COLUMN);</span>
<span class="s1">Node node = mGTaskHashMap.get(gid);</span>
<span class="s2">if </span><span class="s1">(node != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mGTaskHashMap.remove(gid);</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.SYNC_ID, node.getLastModified());</span>
<span class="s1">mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">c.getLong(SqlNote.ID_COLUMN)), values, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;something is missed&quot;</span><span class="s1">);</span>
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span>
<span class="s4">&quot;some local items don't have gid after sync&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.w(TAG, </span><span class="s4">&quot;failed to query local note to refresh sync id&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">c = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getSyncAccount() {</span>
<span class="s2">return </span><span class="s1">GTaskClient.getInstance().getSyncAccount().name;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">cancelSync() {</span>
<span class="s1">mCancelled = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,149 @@
<html>
<head>
<title>GTaskSyncService.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
GTaskSyncService.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.gtask.remote;</span>
<span class="s2">import </span><span class="s1">android.app.Activity;</span>
<span class="s2">import </span><span class="s1">android.app.Service;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.os.Bundle;</span>
<span class="s2">import </span><span class="s1">android.os.IBinder;</span>
<span class="s2">public class </span><span class="s1">GTaskSyncService </span><span class="s2">extends </span><span class="s1">Service {</span>
<span class="s2">public final static </span><span class="s1">String ACTION_STRING_NAME = </span><span class="s3">&quot;sync_action_type&quot;</span><span class="s1">;</span>
<span class="s2">public final static int </span><span class="s1">ACTION_START_SYNC = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">public final static int </span><span class="s1">ACTION_CANCEL_SYNC = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">public final static int </span><span class="s1">ACTION_INVALID = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_SERVICE_BROADCAST_NAME = </span><span class="s3">&quot;net.micode.notes.gtask.remote.gtask_sync_service&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_SERVICE_BROADCAST_IS_SYNCING = </span><span class="s3">&quot;isSyncing&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = </span><span class="s3">&quot;progressMsg&quot;</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">GTaskASyncTask mSyncTask = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">private static </span><span class="s1">String mSyncProgress = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">private void </span><span class="s1">startSync() {</span>
<span class="s2">if </span><span class="s1">(mSyncTask == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mSyncTask = </span><span class="s2">new </span><span class="s1">GTaskASyncTask(</span><span class="s2">this</span><span class="s1">, </span><span class="s2">new </span><span class="s1">GTaskASyncTask.OnCompleteListener() {</span>
<span class="s2">public void </span><span class="s1">onComplete() {</span>
<span class="s1">mSyncTask = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">sendBroadcast(</span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">stopSelf();</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">sendBroadcast(</span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">mSyncTask.execute();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">cancelSync() {</span>
<span class="s2">if </span><span class="s1">(mSyncTask != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mSyncTask.cancelSync();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onCreate() {</span>
<span class="s1">mSyncTask = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public int </span><span class="s1">onStartCommand(Intent intent, </span><span class="s2">int </span><span class="s1">flags, </span><span class="s2">int </span><span class="s1">startId) {</span>
<span class="s1">Bundle bundle = intent.getExtras();</span>
<span class="s2">if </span><span class="s1">(bundle != </span><span class="s2">null </span><span class="s1">&amp;&amp; bundle.containsKey(ACTION_STRING_NAME)) {</span>
<span class="s2">switch </span><span class="s1">(bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {</span>
<span class="s2">case </span><span class="s1">ACTION_START_SYNC:</span>
<span class="s1">startSync();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">ACTION_CANCEL_SYNC:</span>
<span class="s1">cancelSync();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">START_STICKY;</span>
<span class="s1">}</span>
<span class="s2">return super</span><span class="s1">.onStartCommand(intent, flags, startId);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onLowMemory() {</span>
<span class="s2">if </span><span class="s1">(mSyncTask != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mSyncTask.cancelSync();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">IBinder onBind(Intent intent) {</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">sendBroadcast(String msg) {</span>
<span class="s1">mSyncProgress = msg;</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(GTASK_SERVICE_BROADCAST_NAME);</span>
<span class="s1">intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);</span>
<span class="s1">sendBroadcast(intent);</span>
<span class="s1">}</span>
<span class="s2">public static void </span><span class="s1">startSync(Activity activity) {</span>
<span class="s1">GTaskManager.getInstance().setActivityContext(activity);</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(activity, GTaskSyncService.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);</span>
<span class="s1">activity.startService(intent);</span>
<span class="s1">}</span>
<span class="s2">public static void </span><span class="s1">cancelSync(Context context) {</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(context, GTaskSyncService.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);</span>
<span class="s1">context.startService(intent);</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">isSyncing() {</span>
<span class="s2">return </span><span class="s1">mSyncTask != </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">String getProgressString() {</span>
<span class="s2">return </span><span class="s1">mSyncProgress;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.gtask.remote</title></head><body><a href="GTaskClient.java.html">GTaskClient.java</a><br /><a href="GTaskManager.java.html">GTaskManager.java</a><br /><a href="GTaskASyncTask.java.html">GTaskASyncTask.java</a><br /><a href="GTaskSyncService.java.html">GTaskSyncService.java</a><br /></body></html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes</title></head><body><a href="ExampleInstrumentedTest.java.html">ExampleInstrumentedTest.java</a><br /></body></html>

@ -0,0 +1,276 @@
<html>
<head>
<title>Note.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
Note.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.model;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderOperation;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderResult;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.OperationApplicationException;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.os.RemoteException;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.CallNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.TextNote;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">public class </span><span class="s1">Note {</span>
<span class="s2">private </span><span class="s1">ContentValues mNoteDiffValues;</span>
<span class="s2">private </span><span class="s1">NoteData mNoteData;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;Note&quot;</span><span class="s1">;</span>
<span class="s0">/**</span>
<span class="s0">* Create a new note id for adding a new note to databases</span>
<span class="s0">*/</span>
<span class="s2">public static synchronized long </span><span class="s1">getNewNoteId(Context context, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s0">// Create a new note in the database</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s2">long </span><span class="s1">createdTime = System.currentTimeMillis();</span>
<span class="s1">values.put(NoteColumns.CREATED_DATE, createdTime);</span>
<span class="s1">values.put(NoteColumns.MODIFIED_DATE, createdTime);</span>
<span class="s1">values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);</span>
<span class="s1">values.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">values.put(NoteColumns.PARENT_ID, folderId);</span><span class="s0">//将数据写入数据库表格</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);</span>
<span class="s0">//ContentResolver()主要是实现外部应用对ContentProvider中的数据</span>
<span class="s0">//进行添加、删除、修改和查询操作</span>
<span class="s2">long </span><span class="s1">noteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">noteId = Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Get note id error :&quot; </span><span class="s1">+ e.toString());</span>
<span class="s1">noteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span><span class="s0">//try-catch异常处理</span>
<span class="s2">if </span><span class="s1">(noteId == -</span><span class="s4">1</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">noteId;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">Note() {</span>
<span class="s1">mNoteDiffValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mNoteData = </span><span class="s2">new </span><span class="s1">NoteData();</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setNoteValue(String key, String value) {</span>
<span class="s1">mNoteDiffValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setTextData(String key, String value) {</span>
<span class="s1">mNoteData.setTextData(key, value);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setTextDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mNoteData.setTextDataId(id);</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getTextDataId() {</span>
<span class="s2">return </span><span class="s1">mNoteData.mTextDataId;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCallDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s1">mNoteData.setCallDataId(id);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCallData(String key, String value) {</span>
<span class="s1">mNoteData.setCallData(key, value);</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isLocalModified() {</span>
<span class="s2">return </span><span class="s1">mNoteDiffValues.size() &gt; </span><span class="s4">0 </span><span class="s1">|| mNoteData.isLocalModified();</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">syncNote(Context context, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s2">if </span><span class="s1">(noteId &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!isLocalModified()) {</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* In theory, once data changed, the note should be updated on {</span><span class="s5">@link </span><span class="s0">NoteColumns#LOCAL_MODIFIED} and</span>
<span class="s0">* {</span><span class="s5">@link </span><span class="s0">NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the</span>
<span class="s0">* note data info</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(context.getContentResolver().update(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s2">null</span><span class="s1">) == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Update note error, should not happen&quot;</span><span class="s1">);</span>
<span class="s0">// Do not return, fall through</span>
<span class="s1">}</span>
<span class="s1">mNoteDiffValues.clear();</span>
<span class="s2">if </span><span class="s1">(mNoteData.isLocalModified()</span>
<span class="s1">&amp;&amp; (mNoteData.pushIntoContentResolver(context, noteId) == </span><span class="s2">null</span><span class="s1">)) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private class </span><span class="s1">NoteData {</span>
<span class="s2">private long </span><span class="s1">mTextDataId;</span>
<span class="s2">private </span><span class="s1">ContentValues mTextDataValues;</span>
<span class="s2">private long </span><span class="s1">mCallDataId;</span>
<span class="s2">private </span><span class="s1">ContentValues mCallDataValues;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NoteData&quot;</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">NoteData() {</span>
<span class="s1">mTextDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mCallDataValues = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">mTextDataId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mCallDataId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">boolean </span><span class="s1">isLocalModified() {</span>
<span class="s2">return </span><span class="s1">mTextDataValues.size() &gt; </span><span class="s4">0 </span><span class="s1">|| mCallDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setTextDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">if</span><span class="s1">(id &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Text data id should larger than 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mTextDataId = id;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setCallDataId(</span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Call data id should larger than 0&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">mCallDataId = id;</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setCallData(String key, String value) {</span>
<span class="s1">mCallDataValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s2">void </span><span class="s1">setTextData(String key, String value) {</span>
<span class="s1">mTextDataValues.put(key, value);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s1">Uri pushIntoContentResolver(Context context, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s0">/**</span>
<span class="s0">* Check for safety</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(noteId &lt;= </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Wrong note id:&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s1">ArrayList&lt;ContentProviderOperation&gt; operationList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;ContentProviderOperation&gt;();</span>
<span class="s1">ContentProviderOperation.Builder builder = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(mTextDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mTextDataValues.put(DataColumns.NOTE_ID, noteId);</span>
<span class="s2">if </span><span class="s1">(mTextDataId == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,</span>
<span class="s1">mTextDataValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">setTextDataId(Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">)));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Insert new text data fail with noteId&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">mTextDataValues.clear();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mTextDataId));</span>
<span class="s1">builder.withValues(mTextDataValues);</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s1">mTextDataValues.clear();</span>
<span class="s1">}</span>
<span class="s2">if</span><span class="s1">(mCallDataValues.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mCallDataValues.put(DataColumns.NOTE_ID, noteId);</span>
<span class="s2">if </span><span class="s1">(mCallDataId == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE);</span>
<span class="s1">Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,</span>
<span class="s1">mCallDataValues);</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">setCallDataId(Long.valueOf(uri.getPathSegments().get(</span><span class="s4">1</span><span class="s1">)));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NumberFormatException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Insert new call data fail with noteId&quot; </span><span class="s1">+ noteId);</span>
<span class="s1">mCallDataValues.clear();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(</span>
<span class="s1">Notes.CONTENT_DATA_URI, mCallDataId));</span>
<span class="s1">builder.withValues(mCallDataValues);</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s1">mCallDataValues.clear();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(operationList.size() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">ContentProviderResult[] results = context.getContentResolver().applyBatch(</span>
<span class="s1">Notes.AUTHORITY, operationList);</span>
<span class="s2">return </span><span class="s1">(results == </span><span class="s2">null </span><span class="s1">|| results.length == </span><span class="s4">0 </span><span class="s1">|| results[</span><span class="s4">0</span><span class="s1">] == </span><span class="s2">null</span><span class="s1">) ? </span><span class="s2">null</span>
<span class="s1">: ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(RemoteException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(OperationApplicationException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,390 @@
<html>
<head>
<title>WorkingNote.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
WorkingNote.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.model;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.CallNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.TextNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser.NoteBgResources;</span>
<span class="s2">public class </span><span class="s1">WorkingNote {</span>
<span class="s0">// Note for the working note</span>
<span class="s2">private </span><span class="s1">Note mNote;</span>
<span class="s0">// Note Id</span>
<span class="s2">private long </span><span class="s1">mNoteId;</span>
<span class="s0">// Note content</span>
<span class="s2">public </span><span class="s1">String mContent;</span>
<span class="s0">// Note mode</span>
<span class="s2">private int </span><span class="s1">mMode;</span>
<span class="s2">private long </span><span class="s1">mAlertDate;</span>
<span class="s2">private long </span><span class="s1">mModifiedDate;</span>
<span class="s2">private int </span><span class="s1">mBgColorId;</span>
<span class="s2">private int </span><span class="s1">mWidgetId;</span>
<span class="s2">private int </span><span class="s1">mWidgetType;</span>
<span class="s2">private long </span><span class="s1">mFolderId;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;WorkingNote&quot;</span><span class="s1">;</span>
<span class="s2">private boolean </span><span class="s1">mIsDeleted;</span>
<span class="s2">private </span><span class="s1">NoteSettingChangedListener mNoteSettingStatusListener;</span>
<span class="s2">public static final </span><span class="s1">String[] DATA_PROJECTION = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">DataColumns.ID,</span>
<span class="s1">DataColumns.CONTENT,</span>
<span class="s1">DataColumns.MIME_TYPE,</span>
<span class="s1">DataColumns.DATA1,</span>
<span class="s1">DataColumns.DATA2,</span>
<span class="s1">DataColumns.DATA3,</span>
<span class="s1">DataColumns.DATA4,</span>
<span class="s1">};</span>
<span class="s2">public static final </span><span class="s1">String[] NOTE_PROJECTION = </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">NoteColumns.PARENT_ID,</span>
<span class="s1">NoteColumns.ALERTED_DATE,</span>
<span class="s1">NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.WIDGET_ID,</span>
<span class="s1">NoteColumns.WIDGET_TYPE,</span>
<span class="s1">NoteColumns.MODIFIED_DATE</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">DATA_ID_COLUMN = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_CONTENT_COLUMN = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_MIME_TYPE_COLUMN = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_MODE_COLUMN = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_PARENT_ID_COLUMN = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_ALERTED_DATE_COLUMN = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_BG_COLOR_ID_COLUMN = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_WIDGET_ID_COLUMN = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_WIDGET_TYPE_COLUMN = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_MODIFIED_DATE_COLUMN = </span><span class="s4">5</span><span class="s1">;</span>
<span class="s0">// New note construct</span>
<span class="s2">private </span><span class="s1">WorkingNote(Context context, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mAlertDate = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mModifiedDate = System.currentTimeMillis();</span>
<span class="s1">mFolderId = folderId;</span>
<span class="s1">mNote = </span><span class="s2">new </span><span class="s1">Note();</span>
<span class="s1">mNoteId = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mIsDeleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mMode = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">mWidgetType = Notes.TYPE_WIDGET_INVALIDE;</span>
<span class="s1">}</span>
<span class="s0">// Existing note construct</span>
<span class="s2">private </span><span class="s1">WorkingNote(Context context, </span><span class="s2">long </span><span class="s1">noteId, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s1">mContext = context;</span>
<span class="s1">mNoteId = noteId;</span>
<span class="s1">mFolderId = folderId;</span>
<span class="s1">mIsDeleted = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mNote = </span><span class="s2">new </span><span class="s1">Note();</span>
<span class="s1">loadNote();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadNote() {</span>
<span class="s1">Cursor cursor = mContext.getContentResolver().query(</span>
<span class="s1">ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s1">mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);</span>
<span class="s1">mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN);</span>
<span class="s1">mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN);</span>
<span class="s1">mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN);</span>
<span class="s1">mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN);</span>
<span class="s1">mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;No note with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unable to find note with id &quot; </span><span class="s1">+ mNoteId);</span>
<span class="s1">}</span>
<span class="s1">loadNoteData();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadNoteData() {</span>
<span class="s1">Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION,</span>
<span class="s1">DataColumns.NOTE_ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">String.valueOf(mNoteId)</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s1">String type = cursor.getString(DATA_MIME_TYPE_COLUMN);</span>
<span class="s2">if </span><span class="s1">(DataConstants.NOTE.equals(type)) {</span>
<span class="s1">mContent = cursor.getString(DATA_CONTENT_COLUMN);</span>
<span class="s1">mMode = cursor.getInt(DATA_MODE_COLUMN);</span>
<span class="s1">mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN));</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(DataConstants.CALL_NOTE.equals(type)) {</span>
<span class="s1">mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN));</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Wrong note type with type:&quot; </span><span class="s1">+ type);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(cursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;No data with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Unable to find note's data with id &quot; </span><span class="s1">+ mNoteId);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">WorkingNote createEmptyNote(Context context, </span><span class="s2">long </span><span class="s1">folderId, </span><span class="s2">int </span><span class="s1">widgetId,</span>
<span class="s2">int </span><span class="s1">widgetType, </span><span class="s2">int </span><span class="s1">defaultBgColorId) {</span>
<span class="s1">WorkingNote note = </span><span class="s2">new </span><span class="s1">WorkingNote(context, folderId);</span>
<span class="s1">note.setBgColorId(defaultBgColorId);</span>
<span class="s1">note.setWidgetId(widgetId);</span>
<span class="s1">note.setWidgetType(widgetType);</span>
<span class="s2">return </span><span class="s1">note;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">WorkingNote load(Context context, </span><span class="s2">long </span><span class="s1">id) {</span>
<span class="s2">return new </span><span class="s1">WorkingNote(context, id, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public synchronized boolean </span><span class="s1">saveNote() {</span>
<span class="s2">if </span><span class="s1">(isWorthSaving()) {</span>
<span class="s2">if </span><span class="s1">(!existInDatabase()) {</span>
<span class="s2">if </span><span class="s1">((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Create new note fail with id:&quot; </span><span class="s1">+ mNoteId);</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mNote.syncNote(mContext, mNoteId);</span>
<span class="s0">/**</span>
<span class="s0">* Update widget content if there exist any widget of this note</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID</span>
<span class="s1">&amp;&amp; mWidgetType != Notes.TYPE_WIDGET_INVALIDE</span>
<span class="s1">&amp;&amp; mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onWidgetChanged();</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">existInDatabase() {</span>
<span class="s2">return </span><span class="s1">mNoteId &gt; </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">isWorthSaving() {</span>
<span class="s2">if </span><span class="s1">(mIsDeleted || (!existInDatabase() &amp;&amp; TextUtils.isEmpty(mContent))</span>
<span class="s1">|| (existInDatabase() &amp;&amp; !mNote.isLocalModified())) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setOnSettingStatusChangedListener(NoteSettingChangedListener l) {</span>
<span class="s1">mNoteSettingStatusListener = l;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setAlertDate(</span><span class="s2">long </span><span class="s1">date, </span><span class="s2">boolean </span><span class="s1">set) {</span>
<span class="s2">if </span><span class="s1">(date != mAlertDate) {</span>
<span class="s1">mAlertDate = date;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate));</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onClockAlertChanged(date, set);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">markDeleted(</span><span class="s2">boolean </span><span class="s1">mark) {</span>
<span class="s1">mIsDeleted = mark;</span>
<span class="s2">if </span><span class="s1">(mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID</span>
<span class="s1">&amp;&amp; mWidgetType != Notes.TYPE_WIDGET_INVALIDE &amp;&amp; mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onWidgetChanged();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setBgColorId(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id != mBgColorId) {</span>
<span class="s1">mBgColorId = id;</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onBackgroundColorChanged();</span>
<span class="s1">}</span>
<span class="s1">mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCheckListMode(</span><span class="s2">int </span><span class="s1">mode) {</span>
<span class="s2">if </span><span class="s1">(mMode != mode) {</span>
<span class="s2">if </span><span class="s1">(mNoteSettingStatusListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode);</span>
<span class="s1">}</span>
<span class="s1">mMode = mode;</span>
<span class="s1">mNote.setTextData(TextNote.MODE, String.valueOf(mMode));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWidgetType(</span><span class="s2">int </span><span class="s1">type) {</span>
<span class="s2">if </span><span class="s1">(type != mWidgetType) {</span>
<span class="s1">mWidgetType = type;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWidgetId(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">if </span><span class="s1">(id != mWidgetId) {</span>
<span class="s1">mWidgetId = id;</span>
<span class="s1">mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setWorkingText(String text) {</span>
<span class="s2">if </span><span class="s1">(!TextUtils.equals(mContent, text)) {</span>
<span class="s1">mContent = text;</span>
<span class="s1">mNote.setTextData(DataColumns.CONTENT, mContent);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">convertToCallNote(String phoneNumber, </span><span class="s2">long </span><span class="s1">callDate) {</span>
<span class="s1">mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));</span>
<span class="s1">mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);</span>
<span class="s1">mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER));</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">hasClockAlert() {</span>
<span class="s2">return </span><span class="s1">(mAlertDate &gt; </span><span class="s4">0 </span><span class="s1">? </span><span class="s2">true </span><span class="s1">: </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getContent() {</span>
<span class="s2">return </span><span class="s1">mContent;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getAlertDate() {</span>
<span class="s2">return </span><span class="s1">mAlertDate;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getModifiedDate() {</span>
<span class="s2">return </span><span class="s1">mModifiedDate;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getBgColorResId() {</span>
<span class="s2">return </span><span class="s1">NoteBgResources.getNoteBgResource(mBgColorId);</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getBgColorId() {</span>
<span class="s2">return </span><span class="s1">mBgColorId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getTitleBgResId() {</span>
<span class="s2">return </span><span class="s1">NoteBgResources.getNoteTitleBgResource(mBgColorId);</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getCheckListMode() {</span>
<span class="s2">return </span><span class="s1">mMode;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getNoteId() {</span>
<span class="s2">return </span><span class="s1">mNoteId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getFolderId() {</span>
<span class="s2">return </span><span class="s1">mFolderId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetId() {</span>
<span class="s2">return </span><span class="s1">mWidgetId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetType() {</span>
<span class="s2">return </span><span class="s1">mWidgetType;</span>
<span class="s1">}</span>
<span class="s2">public interface </span><span class="s1">NoteSettingChangedListener {</span>
<span class="s0">/**</span>
<span class="s0">* Called when the background color of current note has just changed</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onBackgroundColorChanged();</span>
<span class="s0">/**</span>
<span class="s0">* Called when user set clock</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onClockAlertChanged(</span><span class="s2">long </span><span class="s1">date, </span><span class="s2">boolean </span><span class="s1">set);</span>
<span class="s0">/**</span>
<span class="s0">* Call when user create note from widget</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onWidgetChanged();</span>
<span class="s0">/**</span>
<span class="s0">* Call when switch between check list mode and normal mode</span>
<span class="s0">* </span><span class="s5">@param </span><span class="s0">oldMode is previous mode before change</span>
<span class="s0">* </span><span class="s5">@param </span><span class="s0">newMode is new mode</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onCheckListModeChanged(</span><span class="s2">int </span><span class="s1">oldMode, </span><span class="s2">int </span><span class="s1">newMode);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.model</title></head><body><a href="Note.java.html">Note.java</a><br /><a href="WorkingNote.java.html">WorkingNote.java</a><br /></body></html>

@ -0,0 +1,366 @@
<html>
<head>
<title>BackupUtils.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
BackupUtils.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.tool;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.os.Environment;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateFormat;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.DataConstants;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">java.io.File;</span>
<span class="s2">import </span><span class="s1">java.io.FileNotFoundException;</span>
<span class="s2">import </span><span class="s1">java.io.FileOutputStream;</span>
<span class="s2">import </span><span class="s1">java.io.IOException;</span>
<span class="s2">import </span><span class="s1">java.io.PrintStream;</span>
<span class="s2">public class </span><span class="s1">BackupUtils {</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;BackupUtils&quot;</span><span class="s1">;</span>
<span class="s0">// Singleton stuff</span>
<span class="s2">private static </span><span class="s1">BackupUtils sInstance;</span>
<span class="s2">public static synchronized </span><span class="s1">BackupUtils getInstance(Context context) {</span>
<span class="s2">if </span><span class="s1">(sInstance == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">sInstance = </span><span class="s2">new </span><span class="s1">BackupUtils(context);</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">sInstance;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Following states are signs to represents backup or restore</span>
<span class="s0">* status</span>
<span class="s0">*/</span>
<span class="s0">// Currently, the sdcard is not mounted</span>
<span class="s2">public static final int </span><span class="s1">STATE_SD_CARD_UNMOUONTED = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s0">// The backup file not exist</span>
<span class="s2">public static final int </span><span class="s1">STATE_BACKUP_FILE_NOT_EXIST = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s0">// The data is not well formated, may be changed by other programs</span>
<span class="s2">public static final int </span><span class="s1">STATE_DATA_DESTROIED = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s0">// Some run-time exception which causes restore or backup fails</span>
<span class="s2">public static final int </span><span class="s1">STATE_SYSTEM_ERROR = </span><span class="s4">3</span><span class="s1">;</span>
<span class="s0">// Backup or restore success</span>
<span class="s2">public static final int </span><span class="s1">STATE_SUCCESS = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">TextExport mTextExport;</span>
<span class="s2">private </span><span class="s1">BackupUtils(Context context) {</span>
<span class="s1">mTextExport = </span><span class="s2">new </span><span class="s1">TextExport(context);</span>
<span class="s1">}</span>
<span class="s2">private static boolean </span><span class="s1">externalStorageAvailable() {</span>
<span class="s2">return </span><span class="s1">Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">exportToText() {</span>
<span class="s2">return </span><span class="s1">mTextExport.exportToText();</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getExportedTextFileName() {</span>
<span class="s2">return </span><span class="s1">mTextExport.mFileName;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getExportedTextFileDir() {</span>
<span class="s2">return </span><span class="s1">mTextExport.mFileDirectory;</span>
<span class="s1">}</span>
<span class="s2">private static class </span><span class="s1">TextExport {</span>
<span class="s2">private static final </span><span class="s1">String[] NOTE_PROJECTION = {</span>
<span class="s1">NoteColumns.ID,</span>
<span class="s1">NoteColumns.MODIFIED_DATE,</span>
<span class="s1">NoteColumns.SNIPPET,</span>
<span class="s1">NoteColumns.TYPE</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">NOTE_COLUMN_ID = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_COLUMN_MODIFIED_DATE = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTE_COLUMN_SNIPPET = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String[] DATA_PROJECTION = {</span>
<span class="s1">DataColumns.CONTENT,</span>
<span class="s1">DataColumns.MIME_TYPE,</span>
<span class="s1">DataColumns.DATA1,</span>
<span class="s1">DataColumns.DATA2,</span>
<span class="s1">DataColumns.DATA3,</span>
<span class="s1">DataColumns.DATA4,</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">DATA_COLUMN_CONTENT = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_COLUMN_MIME_TYPE = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_COLUMN_CALL_DATE = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATA_COLUMN_PHONE_NUMBER = </span><span class="s4">4</span><span class="s1">;</span>
<span class="s2">private final </span><span class="s1">String [] TEXT_FORMAT;</span>
<span class="s2">private static final int </span><span class="s1">FORMAT_FOLDER_NAME = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">FORMAT_NOTE_DATE = </span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">FORMAT_NOTE_CONTENT = </span><span class="s4">2</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private </span><span class="s1">String mFileName;</span>
<span class="s2">private </span><span class="s1">String mFileDirectory;</span>
<span class="s2">public </span><span class="s1">TextExport(Context context) {</span>
<span class="s1">TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note);</span>
<span class="s1">mContext = context;</span>
<span class="s1">mFileName = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">mFileDirectory = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">String getFormat(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">TEXT_FORMAT[id];</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Export the folder identified by folder id to text</span>
<span class="s0">*/</span>
<span class="s2">private void </span><span class="s1">exportFolderToText(String folderId, PrintStream ps) {</span>
<span class="s0">// Query notes belong to this folder</span>
<span class="s1">Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">NOTE_PROJECTION, NoteColumns.PARENT_ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">folderId</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(notesCursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(notesCursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s0">// Print note's last modified date</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format(</span>
<span class="s1">mContext.getString(R.string.format_datetime_mdhm),</span>
<span class="s1">notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE))));</span>
<span class="s0">// Query data belong to this note</span>
<span class="s1">String noteId = notesCursor.getString(NOTE_COLUMN_ID);</span>
<span class="s1">exportNoteToText(noteId, ps);</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(notesCursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">notesCursor.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Export note identified by id to a print stream</span>
<span class="s0">*/</span>
<span class="s2">private void </span><span class="s1">exportNoteToText(String noteId, PrintStream ps) {</span>
<span class="s1">Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI,</span>
<span class="s1">DATA_PROJECTION, DataColumns.NOTE_ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s1">noteId</span>
<span class="s1">}, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(dataCursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(dataCursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s1">String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE);</span>
<span class="s2">if </span><span class="s1">(DataConstants.CALL_NOTE.equals(mimeType)) {</span>
<span class="s0">// Print phone number</span>
<span class="s1">String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER);</span>
<span class="s2">long </span><span class="s1">callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE);</span>
<span class="s1">String location = dataCursor.getString(DATA_COLUMN_CONTENT);</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(phoneNumber)) {</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),</span>
<span class="s1">phoneNumber));</span>
<span class="s1">}</span>
<span class="s0">// Print call date</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat</span>
<span class="s1">.format(mContext.getString(R.string.format_datetime_mdhm),</span>
<span class="s1">callDate)));</span>
<span class="s0">// Print call attachment location</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(location)) {</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),</span>
<span class="s1">location));</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(DataConstants.NOTE.equals(mimeType)) {</span>
<span class="s1">String content = dataCursor.getString(DATA_COLUMN_CONTENT);</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(content)) {</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),</span>
<span class="s1">content));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(dataCursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">dataCursor.close();</span>
<span class="s1">}</span>
<span class="s0">// print a line separator between note</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">ps.write(</span><span class="s2">new byte</span><span class="s1">[] {</span>
<span class="s1">Character.LINE_SEPARATOR, Character.LETTER_NUMBER</span>
<span class="s1">});</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IOException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Note will be exported as text which is user readable</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">exportToText() {</span>
<span class="s2">if </span><span class="s1">(!externalStorageAvailable()) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Media was not mounted&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">STATE_SD_CARD_UNMOUONTED;</span>
<span class="s1">}</span>
<span class="s1">PrintStream ps = getExportToTextPrintStream();</span>
<span class="s2">if </span><span class="s1">(ps == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;get print stream error&quot;</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">STATE_SYSTEM_ERROR;</span>
<span class="s1">}</span>
<span class="s0">// First export folder and its notes</span>
<span class="s1">Cursor folderCursor = mContext.getContentResolver().query(</span>
<span class="s1">Notes.CONTENT_NOTE_URI,</span>
<span class="s1">NOTE_PROJECTION,</span>
<span class="s3">&quot;(&quot; </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.TYPE_FOLDER + </span><span class="s3">&quot; AND &quot;</span>
<span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;&lt;&gt;&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER + </span><span class="s3">&quot;) OR &quot;</span>
<span class="s1">+ NoteColumns.ID + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.ID_CALL_RECORD_FOLDER, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(folderCursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(folderCursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s0">// Print folder's name</span>
<span class="s1">String folderName = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">folderName = mContext.getString(R.string.call_record_folder_name);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(folderName)) {</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName));</span>
<span class="s1">}</span>
<span class="s1">String folderId = folderCursor.getString(NOTE_COLUMN_ID);</span>
<span class="s1">exportFolderToText(folderId, ps);</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(folderCursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">folderCursor.close();</span>
<span class="s1">}</span>
<span class="s0">// Export notes in root's folder</span>
<span class="s1">Cursor noteCursor = mContext.getContentResolver().query(</span>
<span class="s1">Notes.CONTENT_NOTE_URI,</span>
<span class="s1">NOTE_PROJECTION,</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ +Notes.TYPE_NOTE + </span><span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID</span>
<span class="s1">+ </span><span class="s3">&quot;=0&quot;</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(noteCursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(noteCursor.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s1">ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format(</span>
<span class="s1">mContext.getString(R.string.format_datetime_mdhm),</span>
<span class="s1">noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE))));</span>
<span class="s0">// Query data belong to this note</span>
<span class="s1">String noteId = noteCursor.getString(NOTE_COLUMN_ID);</span>
<span class="s1">exportNoteToText(noteId, ps);</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(noteCursor.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">noteCursor.close();</span>
<span class="s1">}</span>
<span class="s1">ps.close();</span>
<span class="s2">return </span><span class="s1">STATE_SUCCESS;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get a print stream pointed to the file {</span><span class="s5">@generateExportedTextFile</span><span class="s0">}</span>
<span class="s0">*/</span>
<span class="s2">private </span><span class="s1">PrintStream getExportToTextPrintStream() {</span>
<span class="s1">File file = generateFileMountedOnSDcard(mContext, R.string.file_path,</span>
<span class="s1">R.string.file_name_txt_format);</span>
<span class="s2">if </span><span class="s1">(file == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;create file to exported failed&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mFileName = file.getName();</span>
<span class="s1">mFileDirectory = mContext.getString(R.string.file_path);</span>
<span class="s1">PrintStream ps = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">FileOutputStream fos = </span><span class="s2">new </span><span class="s1">FileOutputStream(file);</span>
<span class="s1">ps = </span><span class="s2">new </span><span class="s1">PrintStream(fos);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(FileNotFoundException e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(NullPointerException e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">ps;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Generate the text file to store imported data</span>
<span class="s0">*/</span>
<span class="s2">private static </span><span class="s1">File generateFileMountedOnSDcard(Context context, </span><span class="s2">int </span><span class="s1">filePathResId, </span><span class="s2">int </span><span class="s1">fileNameFormatResId) {</span>
<span class="s1">StringBuilder sb = </span><span class="s2">new </span><span class="s1">StringBuilder();</span>
<span class="s1">sb.append(Environment.getExternalStorageDirectory());</span>
<span class="s1">sb.append(context.getString(filePathResId));</span>
<span class="s1">File filedir = </span><span class="s2">new </span><span class="s1">File(sb.toString());</span>
<span class="s1">sb.append(context.getString(</span>
<span class="s1">fileNameFormatResId,</span>
<span class="s1">DateFormat.format(context.getString(R.string.format_date_ymd),</span>
<span class="s1">System.currentTimeMillis())));</span>
<span class="s1">File file = </span><span class="s2">new </span><span class="s1">File(sb.toString());</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(!filedir.exists()) {</span>
<span class="s1">filedir.mkdir();</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!file.exists()) {</span>
<span class="s1">file.createNewFile();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">file;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(SecurityException e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IOException e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,318 @@
<html>
<head>
<title>DataUtils.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
.s5 { color: #8c8c8c; font-style: italic;}
.s6 { color: #0037a6;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
DataUtils.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.tool;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderOperation;</span>
<span class="s2">import </span><span class="s1">android.content.ContentProviderResult;</span>
<span class="s2">import </span><span class="s1">android.content.ContentResolver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.OperationApplicationException;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.os.RemoteException;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.CallNote;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;</span>
<span class="s2">import </span><span class="s1">java.util.ArrayList;</span>
<span class="s2">import </span><span class="s1">java.util.HashSet;</span>
<span class="s2">public class </span><span class="s1">DataUtils {</span>
<span class="s2">public static final </span><span class="s1">String TAG = </span><span class="s3">&quot;DataUtils&quot;</span><span class="s1">;</span>
<span class="s2">public static boolean </span><span class="s1">batchDeleteNotes(ContentResolver resolver, HashSet&lt;Long&gt; ids) {</span>
<span class="s2">if </span><span class="s1">(ids == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;the ids is null&quot;</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(ids.size() == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;no id is in the hashset&quot;</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">ArrayList&lt;ContentProviderOperation&gt; operationList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;ContentProviderOperation&gt;();</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">long </span><span class="s1">id : ids) {</span>
<span class="s2">if</span><span class="s1">(id == Notes.ID_ROOT_FOLDER) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Don't delete system folder root&quot;</span><span class="s1">);</span>
<span class="s2">continue</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">ContentProviderOperation.Builder builder = ContentProviderOperation</span>
<span class="s1">.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);</span>
<span class="s2">if </span><span class="s1">(results == </span><span class="s2">null </span><span class="s1">|| results.length == </span><span class="s4">0 </span><span class="s1">|| results[</span><span class="s4">0</span><span class="s1">] == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;delete notes failed, ids:&quot; </span><span class="s1">+ ids.toString());</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(RemoteException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(OperationApplicationException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s1">}</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static void </span><span class="s1">moveNoteToFoler(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">id, </span><span class="s2">long </span><span class="s1">srcFolderId, </span><span class="s2">long </span><span class="s1">desFolderId) {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.PARENT_ID, desFolderId);</span>
<span class="s1">values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);</span>
<span class="s1">values.put(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">batchMoveToFolder(ContentResolver resolver, HashSet&lt;Long&gt; ids,</span>
<span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s2">if </span><span class="s1">(ids == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;the ids is null&quot;</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">ArrayList&lt;ContentProviderOperation&gt; operationList = </span><span class="s2">new </span><span class="s1">ArrayList&lt;ContentProviderOperation&gt;();</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">long </span><span class="s1">id : ids) {</span>
<span class="s1">ContentProviderOperation.Builder builder = ContentProviderOperation</span>
<span class="s1">.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));</span>
<span class="s1">builder.withValue(NoteColumns.PARENT_ID, folderId);</span>
<span class="s1">builder.withValue(NoteColumns.LOCAL_MODIFIED, </span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">operationList.add(builder.build());</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);</span>
<span class="s2">if </span><span class="s1">(results == </span><span class="s2">null </span><span class="s1">|| results.length == </span><span class="s4">0 </span><span class="s1">|| results[</span><span class="s4">0</span><span class="s1">] == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;delete notes failed, ids:&quot; </span><span class="s1">+ ids.toString());</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(RemoteException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(OperationApplicationException e) {</span>
<span class="s1">Log.e(TAG, String.format(</span><span class="s3">&quot;%s: %s&quot;</span><span class="s1">, e.toString(), e.getMessage()));</span>
<span class="s1">}</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get the all folder count except system folders {</span><span class="s5">@link </span><span class="s0">Notes#TYPE_SYSTEM}}</span>
<span class="s0">*/</span>
<span class="s2">public static int </span><span class="s1">getUserFolderCount(ContentResolver resolver) {</span>
<span class="s1">Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI,</span>
<span class="s2">new </span><span class="s1">String[] { </span><span class="s3">&quot;COUNT(*)&quot; </span><span class="s1">},</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot;=? AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;&lt;&gt;?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)},</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">int </span><span class="s1">count = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if</span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">count = cursor.getInt(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IndexOutOfBoundsException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;get folder count failed:&quot; </span><span class="s1">+ e.toString());</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">count;</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">visibleInNoteDatabase(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">noteId, </span><span class="s2">int </span><span class="s1">type) {</span>
<span class="s1">Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),</span>
<span class="s2">null</span><span class="s1">,</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot;=? AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;&lt;&gt;&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER,</span>
<span class="s2">new </span><span class="s1">String [] {String.valueOf(type)},</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">boolean </span><span class="s1">exist = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.getCount() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">exist = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">exist;</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">existInNoteDatabase(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s1">Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),</span>
<span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">boolean </span><span class="s1">exist = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.getCount() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">exist = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">exist;</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">existInDataDatabase(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">dataId) {</span>
<span class="s1">Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),</span>
<span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">boolean </span><span class="s1">exist = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.getCount() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">exist = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">exist;</span>
<span class="s1">}</span>
<span class="s2">public static boolean </span><span class="s1">checkVisibleFolderName(ContentResolver resolver, String name) {</span>
<span class="s1">Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, </span><span class="s2">null</span><span class="s1">,</span>
<span class="s1">NoteColumns.TYPE + </span><span class="s3">&quot;=&quot; </span><span class="s1">+ Notes.TYPE_FOLDER +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">&quot;&lt;&gt;&quot; </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
<span class="s3">&quot; AND &quot; </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">&quot;=?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] { name }, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">boolean </span><span class="s1">exist = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if</span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if</span><span class="s1">(cursor.getCount() &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">exist = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">exist;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">HashSet&lt;AppWidgetAttribute&gt; getFolderNoteWidget(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">folderId) {</span>
<span class="s1">Cursor c = resolver.query(Notes.CONTENT_NOTE_URI,</span>
<span class="s2">new </span><span class="s1">String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE },</span>
<span class="s1">NoteColumns.PARENT_ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] { String.valueOf(folderId) },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s1">HashSet&lt;AppWidgetAttribute&gt; set = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(c.moveToFirst()) {</span>
<span class="s1">set = </span><span class="s2">new </span><span class="s1">HashSet&lt;AppWidgetAttribute&gt;();</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">AppWidgetAttribute widget = </span><span class="s2">new </span><span class="s1">AppWidgetAttribute();</span>
<span class="s1">widget.widgetId = c.getInt(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">widget.widgetType = c.getInt(</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">set.add(widget);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IndexOutOfBoundsException e) {</span>
<span class="s1">Log.e(TAG, e.toString());</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(c.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">set;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">String getCallNumberByNoteId(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s1">Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,</span>
<span class="s2">new </span><span class="s1">String [] { CallNote.PHONE_NUMBER },</span>
<span class="s1">CallNote.NOTE_ID + </span><span class="s3">&quot;=? AND &quot; </span><span class="s1">+ CallNote.MIME_TYPE + </span><span class="s3">&quot;=?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null </span><span class="s1">&amp;&amp; cursor.moveToFirst()) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">return </span><span class="s1">cursor.getString(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IndexOutOfBoundsException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Get call number fails &quot; </span><span class="s1">+ e.toString());</span>
<span class="s1">} </span><span class="s2">finally </span><span class="s1">{</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static long </span><span class="s1">getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, </span><span class="s2">long </span><span class="s1">callDate) {</span>
<span class="s1">Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,</span>
<span class="s2">new </span><span class="s1">String [] { CallNote.NOTE_ID },</span>
<span class="s1">CallNote.CALL_DATE + </span><span class="s3">&quot;=? AND &quot; </span><span class="s1">+ CallNote.MIME_TYPE + </span><span class="s3">&quot;=? AND PHONE_NUMBERS_EQUAL(&quot;</span>
<span class="s1">+ CallNote.PHONE_NUMBER + </span><span class="s3">&quot;,?)&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s2">return </span><span class="s1">cursor.getLong(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IndexOutOfBoundsException e) {</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Get call note id fails &quot; </span><span class="s1">+ e.toString());</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">String getSnippetById(ContentResolver resolver, </span><span class="s2">long </span><span class="s1">noteId) {</span>
<span class="s1">Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,</span>
<span class="s2">new </span><span class="s1">String [] { NoteColumns.SNIPPET },</span>
<span class="s1">NoteColumns.ID + </span><span class="s3">&quot;=?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String [] { String.valueOf(noteId)},</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(cursor != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">String snippet = </span><span class="s3">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(cursor.moveToFirst()) {</span>
<span class="s1">snippet = cursor.getString(</span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">cursor.close();</span>
<span class="s2">return </span><span class="s1">snippet;</span>
<span class="s1">}</span>
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">&quot;Note is not found with id: &quot; </span><span class="s1">+ noteId);</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">String getFormattedSnippet(String snippet) {</span>
<span class="s2">if </span><span class="s1">(snippet != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">snippet = snippet.trim();</span>
<span class="s2">int </span><span class="s1">index = snippet.indexOf(</span><span class="s3">'</span><span class="s6">\n</span><span class="s3">'</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(index != -</span><span class="s4">1</span><span class="s1">) {</span>
<span class="s1">snippet = snippet.substring(</span><span class="s4">0</span><span class="s1">, index);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">snippet;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,133 @@
<html>
<head>
<title>GTaskStringUtils.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
GTaskStringUtils.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.tool;</span>
<span class="s2">public class </span><span class="s1">GTaskStringUtils {</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_ID = </span><span class="s3">&quot;action_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_LIST = </span><span class="s3">&quot;action_list&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE = </span><span class="s3">&quot;action_type&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE_CREATE = </span><span class="s3">&quot;create&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE_GETALL = </span><span class="s3">&quot;get_all&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE_MOVE = </span><span class="s3">&quot;move&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE_UPDATE = </span><span class="s3">&quot;update&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CREATOR_ID = </span><span class="s3">&quot;creator_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CHILD_ENTITY = </span><span class="s3">&quot;child_entity&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CLIENT_VERSION = </span><span class="s3">&quot;client_version&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_COMPLETED = </span><span class="s3">&quot;completed&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CURRENT_LIST_ID = </span><span class="s3">&quot;current_list_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEFAULT_LIST_ID = </span><span class="s3">&quot;default_list_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DELETED = </span><span class="s3">&quot;deleted&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEST_LIST = </span><span class="s3">&quot;dest_list&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEST_PARENT = </span><span class="s3">&quot;dest_parent&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEST_PARENT_TYPE = </span><span class="s3">&quot;dest_parent_type&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ENTITY_DELTA = </span><span class="s3">&quot;entity_delta&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ENTITY_TYPE = </span><span class="s3">&quot;entity_type&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_GET_DELETED = </span><span class="s3">&quot;get_deleted&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ID = </span><span class="s3">&quot;id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_INDEX = </span><span class="s3">&quot;index&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LAST_MODIFIED = </span><span class="s3">&quot;last_modified&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LATEST_SYNC_POINT = </span><span class="s3">&quot;latest_sync_point&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LIST_ID = </span><span class="s3">&quot;list_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LISTS = </span><span class="s3">&quot;lists&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NAME = </span><span class="s3">&quot;name&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NEW_ID = </span><span class="s3">&quot;new_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NOTES = </span><span class="s3">&quot;notes&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_PARENT_ID = </span><span class="s3">&quot;parent_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_PRIOR_SIBLING_ID = </span><span class="s3">&quot;prior_sibling_id&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_RESULTS = </span><span class="s3">&quot;results&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_SOURCE_LIST = </span><span class="s3">&quot;source_list&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TASKS = </span><span class="s3">&quot;tasks&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE = </span><span class="s3">&quot;type&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE_GROUP = </span><span class="s3">&quot;GROUP&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE_TASK = </span><span class="s3">&quot;TASK&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_USER = </span><span class="s3">&quot;user&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String MIUI_FOLDER_PREFFIX = </span><span class="s3">&quot;[MIUI_Notes]&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String FOLDER_DEFAULT = </span><span class="s3">&quot;Default&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String FOLDER_CALL_NOTE = </span><span class="s3">&quot;Call_Note&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String FOLDER_META = </span><span class="s3">&quot;METADATA&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String META_HEAD_GTASK_ID = </span><span class="s3">&quot;meta_gid&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String META_HEAD_NOTE = </span><span class="s3">&quot;meta_note&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String META_HEAD_DATA = </span><span class="s3">&quot;meta_data&quot;</span><span class="s1">;</span>
<span class="s2">public final static </span><span class="s1">String META_NOTE_NAME = </span><span class="s3">&quot;[META INFO] DON'T UPDATE AND DELETE&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,202 @@
<html>
<head>
<title>ResourceParser.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ResourceParser.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.tool;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.preference.PreferenceManager;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NotesPreferenceActivity;</span>
<span class="s2">public class </span><span class="s1">ResourceParser {</span>
<span class="s2">public static final int </span><span class="s1">YELLOW = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">BLUE = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">WHITE = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">GREEN = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">RED = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">BG_DEFAULT_COLOR = YELLOW;</span>
<span class="s2">public static final int </span><span class="s1">TEXT_SMALL = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TEXT_MEDIUM = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TEXT_LARGE = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">TEXT_SUPER = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM;</span>
<span class="s2">public static class </span><span class="s1">NoteBgResources {</span>
<span class="s2">private final static int </span><span class="s1">[] BG_EDIT_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.edit_yellow,</span>
<span class="s1">R.drawable.edit_blue,</span>
<span class="s1">R.drawable.edit_white,</span>
<span class="s1">R.drawable.edit_green,</span>
<span class="s1">R.drawable.edit_red</span>
<span class="s1">};</span>
<span class="s2">private final static int </span><span class="s1">[] BG_EDIT_TITLE_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.edit_title_yellow,</span>
<span class="s1">R.drawable.edit_title_blue,</span>
<span class="s1">R.drawable.edit_title_white,</span>
<span class="s1">R.drawable.edit_title_green,</span>
<span class="s1">R.drawable.edit_title_red</span>
<span class="s1">};</span>
<span class="s2">public static int </span><span class="s1">getNoteBgResource(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_EDIT_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getNoteTitleBgResource(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_EDIT_TITLE_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getDefaultBgId(Context context) {</span>
<span class="s2">if </span><span class="s1">(PreferenceManager.getDefaultSharedPreferences(context).getBoolean(</span>
<span class="s1">NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, </span><span class="s2">false</span><span class="s1">)) {</span>
<span class="s2">return </span><span class="s1">(</span><span class="s2">int</span><span class="s1">) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return </span><span class="s1">BG_DEFAULT_COLOR;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static class </span><span class="s1">NoteItemBgResources {</span>
<span class="s2">private final static int </span><span class="s1">[] BG_FIRST_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.list_yellow_up,</span>
<span class="s1">R.drawable.list_blue_up,</span>
<span class="s1">R.drawable.list_white_up,</span>
<span class="s1">R.drawable.list_green_up,</span>
<span class="s1">R.drawable.list_red_up</span>
<span class="s1">};</span>
<span class="s2">private final static int </span><span class="s1">[] BG_NORMAL_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.list_yellow_middle,</span>
<span class="s1">R.drawable.list_blue_middle,</span>
<span class="s1">R.drawable.list_white_middle,</span>
<span class="s1">R.drawable.list_green_middle,</span>
<span class="s1">R.drawable.list_red_middle</span>
<span class="s1">};</span>
<span class="s2">private final static int </span><span class="s1">[] BG_LAST_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.list_yellow_down,</span>
<span class="s1">R.drawable.list_blue_down,</span>
<span class="s1">R.drawable.list_white_down,</span>
<span class="s1">R.drawable.list_green_down,</span>
<span class="s1">R.drawable.list_red_down,</span>
<span class="s1">};</span>
<span class="s2">private final static int </span><span class="s1">[] BG_SINGLE_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.list_yellow_single,</span>
<span class="s1">R.drawable.list_blue_single,</span>
<span class="s1">R.drawable.list_white_single,</span>
<span class="s1">R.drawable.list_green_single,</span>
<span class="s1">R.drawable.list_red_single</span>
<span class="s1">};</span>
<span class="s2">public static int </span><span class="s1">getNoteBgFirstRes(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_FIRST_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getNoteBgLastRes(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_LAST_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getNoteBgSingleRes(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_SINGLE_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getNoteBgNormalRes(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_NORMAL_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getFolderBgRes() {</span>
<span class="s2">return </span><span class="s1">R.drawable.list_folder;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static class </span><span class="s1">WidgetBgResources {</span>
<span class="s2">private final static int </span><span class="s1">[] BG_2X_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.widget_2x_yellow,</span>
<span class="s1">R.drawable.widget_2x_blue,</span>
<span class="s1">R.drawable.widget_2x_white,</span>
<span class="s1">R.drawable.widget_2x_green,</span>
<span class="s1">R.drawable.widget_2x_red,</span>
<span class="s1">};</span>
<span class="s2">public static int </span><span class="s1">getWidget2xBgResource(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_2X_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">private final static int </span><span class="s1">[] BG_4X_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.drawable.widget_4x_yellow,</span>
<span class="s1">R.drawable.widget_4x_blue,</span>
<span class="s1">R.drawable.widget_4x_white,</span>
<span class="s1">R.drawable.widget_4x_green,</span>
<span class="s1">R.drawable.widget_4x_red</span>
<span class="s1">};</span>
<span class="s2">public static int </span><span class="s1">getWidget4xBgResource(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">BG_4X_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public static class </span><span class="s1">TextAppearanceResources {</span>
<span class="s2">private final static int </span><span class="s1">[] TEXTAPPEARANCE_RESOURCES = </span><span class="s2">new int </span><span class="s1">[] {</span>
<span class="s1">R.style.TextAppearanceNormal,</span>
<span class="s1">R.style.TextAppearanceMedium,</span>
<span class="s1">R.style.TextAppearanceLarge,</span>
<span class="s1">R.style.TextAppearanceSuper</span>
<span class="s1">};</span>
<span class="s2">public static int </span><span class="s1">getTexAppearanceResource(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s0">/**</span>
<span class="s0">* HACKME: Fix bug of store the resource id in shared preference.</span>
<span class="s0">* The id may larger than the length of resources, in this case,</span>
<span class="s0">* return the {</span><span class="s4">@link </span><span class="s0">ResourceParser#BG_DEFAULT_FONT_SIZE}</span>
<span class="s0">*/</span>
<span class="s2">if </span><span class="s1">(id &gt;= TEXTAPPEARANCE_RESOURCES.length) {</span>
<span class="s2">return </span><span class="s1">BG_DEFAULT_FONT_SIZE;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">TEXTAPPEARANCE_RESOURCES[id];</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getResourcesSize() {</span>
<span class="s2">return </span><span class="s1">TEXTAPPEARANCE_RESOURCES.length;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.tool</title></head><body><a href="DataUtils.java.html">DataUtils.java</a><br /><a href="BackupUtils.java.html">BackupUtils.java</a><br /><a href="ResourceParser.java.html">ResourceParser.java</a><br /><a href="GTaskStringUtils.java.html">GTaskStringUtils.java</a><br /></body></html>

@ -0,0 +1,178 @@
<html>
<head>
<title>AlarmAlertActivity.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
AlarmAlertActivity.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.app.Activity;</span>
<span class="s2">import </span><span class="s1">android.app.AlertDialog;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface.OnClickListener;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface.OnDismissListener;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.media.AudioManager;</span>
<span class="s2">import </span><span class="s1">android.media.MediaPlayer;</span>
<span class="s2">import </span><span class="s1">android.media.RingtoneManager;</span>
<span class="s2">import </span><span class="s1">android.net.Uri;</span>
<span class="s2">import </span><span class="s1">android.os.Bundle;</span>
<span class="s2">import </span><span class="s1">android.os.PowerManager;</span>
<span class="s2">import </span><span class="s1">android.provider.Settings;</span>
<span class="s2">import </span><span class="s1">android.view.Window;</span>
<span class="s2">import </span><span class="s1">android.view.WindowManager;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.DataUtils;</span>
<span class="s2">import </span><span class="s1">java.io.IOException;</span>
<span class="s2">public class </span><span class="s1">AlarmAlertActivity </span><span class="s2">extends </span><span class="s1">Activity </span><span class="s2">implements </span><span class="s1">OnClickListener, OnDismissListener {</span>
<span class="s2">private long </span><span class="s1">mNoteId;</span>
<span class="s2">private </span><span class="s1">String mSnippet;</span>
<span class="s2">private static final int </span><span class="s1">SNIPPET_PREW_MAX_LEN = </span><span class="s3">60</span><span class="s1">;</span>
<span class="s1">MediaPlayer mPlayer;</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onCreate(Bundle savedInstanceState) {</span>
<span class="s2">super</span><span class="s1">.onCreate(savedInstanceState);</span>
<span class="s1">requestWindowFeature(Window.FEATURE_NO_TITLE);</span>
<span class="s2">final </span><span class="s1">Window win = getWindow();</span>
<span class="s1">win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);</span>
<span class="s2">if </span><span class="s1">(!isScreenOn()) {</span>
<span class="s1">win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON</span>
<span class="s1">| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON</span>
<span class="s1">| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON</span>
<span class="s1">| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);</span>
<span class="s1">}</span>
<span class="s1">Intent intent = getIntent();</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mNoteId = Long.valueOf(intent.getData().getPathSegments().get(</span><span class="s3">1</span><span class="s1">));</span>
<span class="s1">mSnippet = DataUtils.getSnippetById(</span><span class="s2">this</span><span class="s1">.getContentResolver(), mNoteId);</span>
<span class="s1">mSnippet = mSnippet.length() &gt; SNIPPET_PREW_MAX_LEN ? mSnippet.substring(</span><span class="s3">0</span><span class="s1">,</span>
<span class="s1">SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)</span>
<span class="s1">: mSnippet;</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IllegalArgumentException e) {</span>
<span class="s1">e.printStackTrace();</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mPlayer = </span><span class="s2">new </span><span class="s1">MediaPlayer();</span>
<span class="s2">if </span><span class="s1">(DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {</span>
<span class="s1">showActionDialog();</span>
<span class="s1">playAlarmSound();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">finish();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private boolean </span><span class="s1">isScreenOn() {</span>
<span class="s1">PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);</span>
<span class="s2">return </span><span class="s1">pm.isScreenOn();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">playAlarmSound() {</span>
<span class="s1">Uri url = RingtoneManager.getActualDefaultRingtoneUri(</span><span class="s2">this</span><span class="s1">, RingtoneManager.TYPE_ALARM);</span>
<span class="s2">int </span><span class="s1">silentModeStreams = Settings.System.getInt(getContentResolver(),</span>
<span class="s1">Settings.System.MODE_RINGER_STREAMS_AFFECTED, </span><span class="s3">0</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">((silentModeStreams &amp; (</span><span class="s3">1 </span><span class="s1">&lt;&lt; AudioManager.STREAM_ALARM)) != </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">mPlayer.setAudioStreamType(silentModeStreams);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);</span>
<span class="s1">}</span>
<span class="s2">try </span><span class="s1">{</span>
<span class="s1">mPlayer.setDataSource(</span><span class="s2">this</span><span class="s1">, url);</span>
<span class="s1">mPlayer.prepare();</span>
<span class="s1">mPlayer.setLooping(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">mPlayer.start();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IllegalArgumentException e) {</span>
<span class="s0">// TODO Auto-generated catch block</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(SecurityException e) {</span>
<span class="s0">// TODO Auto-generated catch block</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IllegalStateException e) {</span>
<span class="s0">// TODO Auto-generated catch block</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">} </span><span class="s2">catch </span><span class="s1">(IOException e) {</span>
<span class="s0">// TODO Auto-generated catch block</span>
<span class="s1">e.printStackTrace();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showActionDialog() {</span>
<span class="s1">AlertDialog.Builder dialog = </span><span class="s2">new </span><span class="s1">AlertDialog.Builder(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">dialog.setTitle(R.string.app_name);</span>
<span class="s1">dialog.setMessage(mSnippet);</span>
<span class="s1">dialog.setPositiveButton(R.string.notealert_ok, </span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(isScreenOn()) {</span>
<span class="s1">dialog.setNegativeButton(R.string.notealert_enter, </span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">dialog.show().setOnDismissListener(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onClick(DialogInterface dialog, </span><span class="s2">int </span><span class="s1">which) {</span>
<span class="s2">switch </span><span class="s1">(which) {</span>
<span class="s2">case </span><span class="s1">DialogInterface.BUTTON_NEGATIVE:</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, NoteEditActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.setAction(Intent.ACTION_VIEW);</span>
<span class="s1">intent.putExtra(Intent.EXTRA_UID, mNoteId);</span>
<span class="s1">startActivity(intent);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onDismiss(DialogInterface dialog) {</span>
<span class="s1">stopAlarmSound();</span>
<span class="s1">finish();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">stopAlarmSound() {</span>
<span class="s2">if </span><span class="s1">(mPlayer != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mPlayer.stop();</span>
<span class="s1">mPlayer.release();</span>
<span class="s1">mPlayer = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,86 @@
<html>
<head>
<title>AlarmInitReceiver.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
AlarmInitReceiver.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.app.AlarmManager;</span>
<span class="s2">import </span><span class="s1">android.app.PendingIntent;</span>
<span class="s2">import </span><span class="s1">android.content.BroadcastReceiver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentUris;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">public class </span><span class="s1">AlarmInitReceiver </span><span class="s2">extends </span><span class="s1">BroadcastReceiver {</span>
<span class="s2">private static final </span><span class="s1">String [] PROJECTION = </span><span class="s2">new </span><span class="s1">String [] {</span>
<span class="s1">NoteColumns.ID,</span>
<span class="s1">NoteColumns.ALERTED_DATE</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">COLUMN_ID = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">COLUMN_ALERTED_DATE = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onReceive(Context context, Intent intent) {</span>
<span class="s2">long </span><span class="s1">currentDate = System.currentTimeMillis();</span>
<span class="s1">Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">PROJECTION,</span>
<span class="s1">NoteColumns.ALERTED_DATE + </span><span class="s4">&quot;&gt;? AND &quot; </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s4">&quot;=&quot; </span><span class="s1">+ Notes.TYPE_NOTE,</span>
<span class="s2">new </span><span class="s1">String[] { String.valueOf(currentDate) },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(c.moveToFirst()) {</span>
<span class="s2">do </span><span class="s1">{</span>
<span class="s2">long </span><span class="s1">alertDate = c.getLong(COLUMN_ALERTED_DATE);</span>
<span class="s1">Intent sender = </span><span class="s2">new </span><span class="s1">Intent(context, AlarmReceiver.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID)));</span>
<span class="s1">PendingIntent pendingIntent = PendingIntent.getBroadcast(context, </span><span class="s3">0</span><span class="s1">, sender, </span><span class="s3">0</span><span class="s1">);</span>
<span class="s1">AlarmManager alermManager = (AlarmManager) context</span>
<span class="s1">.getSystemService(Context.ALARM_SERVICE);</span>
<span class="s1">alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);</span>
<span class="s1">} </span><span class="s2">while </span><span class="s1">(c.moveToNext());</span>
<span class="s1">}</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,49 @@
<html>
<head>
<title>AlarmReceiver.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
AlarmReceiver.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.BroadcastReceiver;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">public class </span><span class="s1">AlarmReceiver </span><span class="s2">extends </span><span class="s1">BroadcastReceiver {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onReceive(Context context, Intent intent) {</span>
<span class="s1">intent.setClass(context, AlarmAlertActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);</span>
<span class="s1">context.startActivity(intent);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,507 @@
<html>
<head>
<title>DateTimePicker.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
DateTimePicker.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">java.text.DateFormatSymbols;</span>
<span class="s2">import </span><span class="s1">java.util.Calendar;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateFormat;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.widget.FrameLayout;</span>
<span class="s2">import </span><span class="s1">android.widget.NumberPicker;</span>
<span class="s2">public class </span><span class="s1">DateTimePicker </span><span class="s2">extends </span><span class="s1">FrameLayout {</span>
<span class="s2">private static final boolean </span><span class="s1">DEFAULT_ENABLE_STATE = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOURS_IN_HALF_DAY = </span><span class="s3">12</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOURS_IN_ALL_DAY = </span><span class="s3">24</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DAYS_IN_ALL_WEEK = </span><span class="s3">7</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATE_SPINNER_MIN_VAL = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = </span><span class="s3">23</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = </span><span class="s3">12</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">MINUT_SPINNER_MIN_VAL = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">MINUT_SPINNER_MAX_VAL = </span><span class="s3">59</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">AMPM_SPINNER_MIN_VAL = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">AMPM_SPINNER_MAX_VAL = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">private final </span><span class="s1">NumberPicker mDateSpinner;</span>
<span class="s2">private final </span><span class="s1">NumberPicker mHourSpinner;</span>
<span class="s2">private final </span><span class="s1">NumberPicker mMinuteSpinner;</span>
<span class="s2">private final </span><span class="s1">NumberPicker mAmPmSpinner;</span>
<span class="s2">private </span><span class="s1">Calendar mDate;</span>
<span class="s2">private </span><span class="s1">String[] mDateDisplayValues = </span><span class="s2">new </span><span class="s1">String[DAYS_IN_ALL_WEEK];</span>
<span class="s2">private boolean </span><span class="s1">mIsAm;</span>
<span class="s2">private boolean </span><span class="s1">mIs24HourView;</span>
<span class="s2">private boolean </span><span class="s1">mIsEnabled = DEFAULT_ENABLE_STATE;</span>
<span class="s2">private boolean </span><span class="s1">mInitialising;</span>
<span class="s2">private </span><span class="s1">OnDateTimeChangedListener mOnDateTimeChangedListener;</span>
<span class="s2">private </span><span class="s1">NumberPicker.OnValueChangeListener mOnDateChangedListener = </span><span class="s2">new </span><span class="s1">NumberPicker.OnValueChangeListener() {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onValueChange(NumberPicker picker, </span><span class="s2">int </span><span class="s1">oldVal, </span><span class="s2">int </span><span class="s1">newVal) {</span>
<span class="s1">mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal);</span>
<span class="s1">updateDateControl();</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s1">};</span>
<span class="s2">private </span><span class="s1">NumberPicker.OnValueChangeListener mOnHourChangedListener = </span><span class="s2">new </span><span class="s1">NumberPicker.OnValueChangeListener() {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onValueChange(NumberPicker picker, </span><span class="s2">int </span><span class="s1">oldVal, </span><span class="s2">int </span><span class="s1">newVal) {</span>
<span class="s2">boolean </span><span class="s1">isDateChanged = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">Calendar cal = Calendar.getInstance();</span>
<span class="s2">if </span><span class="s1">(!mIs24HourView) {</span>
<span class="s2">if </span><span class="s1">(!mIsAm &amp;&amp; oldVal == HOURS_IN_HALF_DAY - </span><span class="s3">1 </span><span class="s1">&amp;&amp; newVal == HOURS_IN_HALF_DAY) {</span>
<span class="s1">cal.setTimeInMillis(mDate.getTimeInMillis());</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">isDateChanged = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(mIsAm &amp;&amp; oldVal == HOURS_IN_HALF_DAY &amp;&amp; newVal == HOURS_IN_HALF_DAY - </span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">cal.setTimeInMillis(mDate.getTimeInMillis());</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, -</span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">isDateChanged = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(oldVal == HOURS_IN_HALF_DAY - </span><span class="s3">1 </span><span class="s1">&amp;&amp; newVal == HOURS_IN_HALF_DAY ||</span>
<span class="s1">oldVal == HOURS_IN_HALF_DAY &amp;&amp; newVal == HOURS_IN_HALF_DAY - </span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">mIsAm = !mIsAm;</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">if </span><span class="s1">(oldVal == HOURS_IN_ALL_DAY - </span><span class="s3">1 </span><span class="s1">&amp;&amp; newVal == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">cal.setTimeInMillis(mDate.getTimeInMillis());</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">isDateChanged = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(oldVal == </span><span class="s3">0 </span><span class="s1">&amp;&amp; newVal == HOURS_IN_ALL_DAY - </span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">cal.setTimeInMillis(mDate.getTimeInMillis());</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, -</span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">isDateChanged = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">int </span><span class="s1">newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? </span><span class="s3">0 </span><span class="s1">: HOURS_IN_HALF_DAY);</span>
<span class="s1">mDate.set(Calendar.HOUR_OF_DAY, newHour);</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s2">if </span><span class="s1">(isDateChanged) {</span>
<span class="s1">setCurrentYear(cal.get(Calendar.YEAR));</span>
<span class="s1">setCurrentMonth(cal.get(Calendar.MONTH));</span>
<span class="s1">setCurrentDay(cal.get(Calendar.DAY_OF_MONTH));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">};</span>
<span class="s2">private </span><span class="s1">NumberPicker.OnValueChangeListener mOnMinuteChangedListener = </span><span class="s2">new </span><span class="s1">NumberPicker.OnValueChangeListener() {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onValueChange(NumberPicker picker, </span><span class="s2">int </span><span class="s1">oldVal, </span><span class="s2">int </span><span class="s1">newVal) {</span>
<span class="s2">int </span><span class="s1">minValue = mMinuteSpinner.getMinValue();</span>
<span class="s2">int </span><span class="s1">maxValue = mMinuteSpinner.getMaxValue();</span>
<span class="s2">int </span><span class="s1">offset = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(oldVal == maxValue &amp;&amp; newVal == minValue) {</span>
<span class="s1">offset += </span><span class="s3">1</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(oldVal == minValue &amp;&amp; newVal == maxValue) {</span>
<span class="s1">offset -= </span><span class="s3">1</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(offset != </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">mDate.add(Calendar.HOUR_OF_DAY, offset);</span>
<span class="s1">mHourSpinner.setValue(getCurrentHour());</span>
<span class="s1">updateDateControl();</span>
<span class="s2">int </span><span class="s1">newHour = getCurrentHourOfDay();</span>
<span class="s2">if </span><span class="s1">(newHour &gt;= HOURS_IN_HALF_DAY) {</span>
<span class="s1">mIsAm = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mIsAm = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mDate.set(Calendar.MINUTE, newVal);</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s1">};</span>
<span class="s2">private </span><span class="s1">NumberPicker.OnValueChangeListener mOnAmPmChangedListener = </span><span class="s2">new </span><span class="s1">NumberPicker.OnValueChangeListener() {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onValueChange(NumberPicker picker, </span><span class="s2">int </span><span class="s1">oldVal, </span><span class="s2">int </span><span class="s1">newVal) {</span>
<span class="s1">mIsAm = !mIsAm;</span>
<span class="s2">if </span><span class="s1">(mIsAm) {</span>
<span class="s1">mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);</span>
<span class="s1">}</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s1">};</span>
<span class="s2">public interface </span><span class="s1">OnDateTimeChangedListener {</span>
<span class="s2">void </span><span class="s1">onDateTimeChanged(DateTimePicker view, </span><span class="s2">int </span><span class="s1">year, </span><span class="s2">int </span><span class="s1">month,</span>
<span class="s2">int </span><span class="s1">dayOfMonth, </span><span class="s2">int </span><span class="s1">hourOfDay, </span><span class="s2">int </span><span class="s1">minute);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">DateTimePicker(Context context) {</span>
<span class="s2">this</span><span class="s1">(context, System.currentTimeMillis());</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">DateTimePicker(Context context, </span><span class="s2">long </span><span class="s1">date) {</span>
<span class="s2">this</span><span class="s1">(context, date, DateFormat.is24HourFormat(context));</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">DateTimePicker(Context context, </span><span class="s2">long </span><span class="s1">date, </span><span class="s2">boolean </span><span class="s1">is24HourView) {</span>
<span class="s2">super</span><span class="s1">(context);</span>
<span class="s1">mDate = Calendar.getInstance();</span>
<span class="s1">mInitialising = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">mIsAm = getCurrentHourOfDay() &gt;= HOURS_IN_HALF_DAY;</span>
<span class="s1">inflate(context, R.layout.datetime_picker, </span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mDateSpinner = (NumberPicker) findViewById(R.id.date);</span>
<span class="s1">mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL);</span>
<span class="s1">mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL);</span>
<span class="s1">mDateSpinner.setOnValueChangedListener(mOnDateChangedListener);</span>
<span class="s1">mHourSpinner = (NumberPicker) findViewById(R.id.hour);</span>
<span class="s1">mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);</span>
<span class="s1">mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);</span>
<span class="s1">mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL);</span>
<span class="s1">mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL);</span>
<span class="s1">mMinuteSpinner.setOnLongPressUpdateInterval(</span><span class="s3">100</span><span class="s1">);</span>
<span class="s1">mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);</span>
<span class="s1">String[] stringsForAmPm = </span><span class="s2">new </span><span class="s1">DateFormatSymbols().getAmPmStrings();</span>
<span class="s1">mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm);</span>
<span class="s1">mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL);</span>
<span class="s1">mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL);</span>
<span class="s1">mAmPmSpinner.setDisplayedValues(stringsForAmPm);</span>
<span class="s1">mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener);</span>
<span class="s0">// update controls to initial state</span>
<span class="s1">updateDateControl();</span>
<span class="s1">updateHourControl();</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">set24HourView(is24HourView);</span>
<span class="s0">// set to current time</span>
<span class="s1">setCurrentDate(date);</span>
<span class="s1">setEnabled(isEnabled());</span>
<span class="s0">// set the content descriptions</span>
<span class="s1">mInitialising = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">setEnabled(</span><span class="s2">boolean </span><span class="s1">enabled) {</span>
<span class="s2">if </span><span class="s1">(mIsEnabled == enabled) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">super</span><span class="s1">.setEnabled(enabled);</span>
<span class="s1">mDateSpinner.setEnabled(enabled);</span>
<span class="s1">mMinuteSpinner.setEnabled(enabled);</span>
<span class="s1">mHourSpinner.setEnabled(enabled);</span>
<span class="s1">mAmPmSpinner.setEnabled(enabled);</span>
<span class="s1">mIsEnabled = enabled;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">isEnabled() {</span>
<span class="s2">return </span><span class="s1">mIsEnabled;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get the current date in millis</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">the current date in millis</span>
<span class="s0">*/</span>
<span class="s2">public long </span><span class="s1">getCurrentDateInTimeMillis() {</span>
<span class="s2">return </span><span class="s1">mDate.getTimeInMillis();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set the current date</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">date The current date in millis</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentDate(</span><span class="s2">long </span><span class="s1">date) {</span>
<span class="s1">Calendar cal = Calendar.getInstance();</span>
<span class="s1">cal.setTimeInMillis(date);</span>
<span class="s1">setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),</span>
<span class="s1">cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set the current date</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">year The current year</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">month The current month</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">dayOfMonth The current dayOfMonth</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">hourOfDay The current hourOfDay</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">minute The current minute</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentDate(</span><span class="s2">int </span><span class="s1">year, </span><span class="s2">int </span><span class="s1">month,</span>
<span class="s2">int </span><span class="s1">dayOfMonth, </span><span class="s2">int </span><span class="s1">hourOfDay, </span><span class="s2">int </span><span class="s1">minute) {</span>
<span class="s1">setCurrentYear(year);</span>
<span class="s1">setCurrentMonth(month);</span>
<span class="s1">setCurrentDay(dayOfMonth);</span>
<span class="s1">setCurrentHour(hourOfDay);</span>
<span class="s1">setCurrentMinute(minute);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get current year</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">The current year</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">getCurrentYear() {</span>
<span class="s2">return </span><span class="s1">mDate.get(Calendar.YEAR);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set current year</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">year The current year</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentYear(</span><span class="s2">int </span><span class="s1">year) {</span>
<span class="s2">if </span><span class="s1">(!mInitialising &amp;&amp; year == getCurrentYear()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mDate.set(Calendar.YEAR, year);</span>
<span class="s1">updateDateControl();</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get current month in the year</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">The current month in the year</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">getCurrentMonth() {</span>
<span class="s2">return </span><span class="s1">mDate.get(Calendar.MONTH);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set current month in the year</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">month The month in the year</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentMonth(</span><span class="s2">int </span><span class="s1">month) {</span>
<span class="s2">if </span><span class="s1">(!mInitialising &amp;&amp; month == getCurrentMonth()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mDate.set(Calendar.MONTH, month);</span>
<span class="s1">updateDateControl();</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get current day of the month</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">The day of the month</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">getCurrentDay() {</span>
<span class="s2">return </span><span class="s1">mDate.get(Calendar.DAY_OF_MONTH);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set current day of the month</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">dayOfMonth The day of the month</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentDay(</span><span class="s2">int </span><span class="s1">dayOfMonth) {</span>
<span class="s2">if </span><span class="s1">(!mInitialising &amp;&amp; dayOfMonth == getCurrentDay()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);</span>
<span class="s1">updateDateControl();</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get current hour in 24 hour mode, in the range (0~23)</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">The current hour in 24 hour mode</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">getCurrentHourOfDay() {</span>
<span class="s2">return </span><span class="s1">mDate.get(Calendar.HOUR_OF_DAY);</span>
<span class="s1">}</span>
<span class="s2">private int </span><span class="s1">getCurrentHour() {</span>
<span class="s2">if </span><span class="s1">(mIs24HourView){</span>
<span class="s2">return </span><span class="s1">getCurrentHourOfDay();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">int </span><span class="s1">hour = getCurrentHourOfDay();</span>
<span class="s2">if </span><span class="s1">(hour &gt; HOURS_IN_HALF_DAY) {</span>
<span class="s2">return </span><span class="s1">hour - HOURS_IN_HALF_DAY;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">return </span><span class="s1">hour == </span><span class="s3">0 </span><span class="s1">? HOURS_IN_HALF_DAY : hour;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set current hour in 24 hour mode, in the range (0~23)</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">hourOfDay</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentHour(</span><span class="s2">int </span><span class="s1">hourOfDay) {</span>
<span class="s2">if </span><span class="s1">(!mInitialising &amp;&amp; hourOfDay == getCurrentHourOfDay()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);</span>
<span class="s2">if </span><span class="s1">(!mIs24HourView) {</span>
<span class="s2">if </span><span class="s1">(hourOfDay &gt;= HOURS_IN_HALF_DAY) {</span>
<span class="s1">mIsAm = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(hourOfDay &gt; HOURS_IN_HALF_DAY) {</span>
<span class="s1">hourOfDay -= HOURS_IN_HALF_DAY;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mIsAm = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(hourOfDay == </span><span class="s3">0</span><span class="s1">) {</span>
<span class="s1">hourOfDay = HOURS_IN_HALF_DAY;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">}</span>
<span class="s1">mHourSpinner.setValue(hourOfDay);</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Get currentMinute</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">The Current Minute</span>
<span class="s0">*/</span>
<span class="s2">public int </span><span class="s1">getCurrentMinute() {</span>
<span class="s2">return </span><span class="s1">mDate.get(Calendar.MINUTE);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set current minute</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setCurrentMinute(</span><span class="s2">int </span><span class="s1">minute) {</span>
<span class="s2">if </span><span class="s1">(!mInitialising &amp;&amp; minute == getCurrentMinute()) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mMinuteSpinner.setValue(minute);</span>
<span class="s1">mDate.set(Calendar.MINUTE, minute);</span>
<span class="s1">onDateTimeChanged();</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* </span><span class="s4">@return </span><span class="s0">true if this is in 24 hour view else false.</span>
<span class="s0">*/</span>
<span class="s2">public boolean </span><span class="s1">is24HourView () {</span>
<span class="s2">return </span><span class="s1">mIs24HourView;</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set whether in 24 hour or AM/PM mode.</span>
<span class="s0">*</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">is24HourView True for 24 hour mode. False for AM/PM mode.</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">set24HourView(</span><span class="s2">boolean </span><span class="s1">is24HourView) {</span>
<span class="s2">if </span><span class="s1">(mIs24HourView == is24HourView) {</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">mIs24HourView = is24HourView;</span>
<span class="s1">mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);</span>
<span class="s2">int </span><span class="s1">hour = getCurrentHourOfDay();</span>
<span class="s1">updateHourControl();</span>
<span class="s1">setCurrentHour(hour);</span>
<span class="s1">updateAmPmControl();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateDateControl() {</span>
<span class="s1">Calendar cal = Calendar.getInstance();</span>
<span class="s1">cal.setTimeInMillis(mDate.getTimeInMillis());</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / </span><span class="s3">2 </span><span class="s1">- </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">mDateSpinner.setDisplayedValues(</span><span class="s2">null</span><span class="s1">);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; DAYS_IN_ALL_WEEK; ++i) {</span>
<span class="s1">cal.add(Calendar.DAY_OF_YEAR, </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">mDateDisplayValues[i] = (String) DateFormat.format(</span><span class="s5">&quot;MM.dd EEEE&quot;</span><span class="s1">, cal);</span>
<span class="s1">}</span>
<span class="s1">mDateSpinner.setDisplayedValues(mDateDisplayValues);</span>
<span class="s1">mDateSpinner.setValue(DAYS_IN_ALL_WEEK / </span><span class="s3">2</span><span class="s1">);</span>
<span class="s1">mDateSpinner.invalidate();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateAmPmControl() {</span>
<span class="s2">if </span><span class="s1">(mIs24HourView) {</span>
<span class="s1">mAmPmSpinner.setVisibility(View.GONE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">int </span><span class="s1">index = mIsAm ? Calendar.AM : Calendar.PM;</span>
<span class="s1">mAmPmSpinner.setValue(index);</span>
<span class="s1">mAmPmSpinner.setVisibility(View.VISIBLE);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateHourControl() {</span>
<span class="s2">if </span><span class="s1">(mIs24HourView) {</span>
<span class="s1">mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);</span>
<span class="s1">mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);</span>
<span class="s1">mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Set the callback that indicates the 'Set' button has been pressed.</span>
<span class="s0">* </span><span class="s4">@param </span><span class="s0">callback the callback, if null will do nothing</span>
<span class="s0">*/</span>
<span class="s2">public void </span><span class="s1">setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {</span>
<span class="s1">mOnDateTimeChangedListener = callback;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">onDateTimeChanged() {</span>
<span class="s2">if </span><span class="s1">(mOnDateTimeChangedListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mOnDateTimeChangedListener.onDateTimeChanged(</span><span class="s2">this</span><span class="s1">, getCurrentYear(),</span>
<span class="s1">getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,109 @@
<html>
<head>
<title>DateTimePickerDialog.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
DateTimePickerDialog.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">java.util.Calendar;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.DateTimePicker;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;</span>
<span class="s2">import </span><span class="s1">android.app.AlertDialog;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface.OnClickListener;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateFormat;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateUtils;</span>
<span class="s2">public class </span><span class="s1">DateTimePickerDialog </span><span class="s2">extends </span><span class="s1">AlertDialog </span><span class="s2">implements </span><span class="s1">OnClickListener {</span>
<span class="s2">private </span><span class="s1">Calendar mDate = Calendar.getInstance();</span>
<span class="s2">private boolean </span><span class="s1">mIs24HourView;</span>
<span class="s2">private </span><span class="s1">OnDateTimeSetListener mOnDateTimeSetListener;</span>
<span class="s2">private </span><span class="s1">DateTimePicker mDateTimePicker;</span>
<span class="s2">public interface </span><span class="s1">OnDateTimeSetListener {</span>
<span class="s2">void </span><span class="s1">OnDateTimeSet(AlertDialog dialog, </span><span class="s2">long </span><span class="s1">date);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">DateTimePickerDialog(Context context, </span><span class="s2">long </span><span class="s1">date) {</span>
<span class="s2">super</span><span class="s1">(context);</span>
<span class="s1">mDateTimePicker = </span><span class="s2">new </span><span class="s1">DateTimePicker(context);</span>
<span class="s1">setView(mDateTimePicker);</span>
<span class="s1">mDateTimePicker.setOnDateTimeChangedListener(</span><span class="s2">new </span><span class="s1">OnDateTimeChangedListener() {</span>
<span class="s2">public void </span><span class="s1">onDateTimeChanged(DateTimePicker view, </span><span class="s2">int </span><span class="s1">year, </span><span class="s2">int </span><span class="s1">month,</span>
<span class="s2">int </span><span class="s1">dayOfMonth, </span><span class="s2">int </span><span class="s1">hourOfDay, </span><span class="s2">int </span><span class="s1">minute) {</span>
<span class="s1">mDate.set(Calendar.YEAR, year);</span>
<span class="s1">mDate.set(Calendar.MONTH, month);</span>
<span class="s1">mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);</span>
<span class="s1">mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);</span>
<span class="s1">mDate.set(Calendar.MINUTE, minute);</span>
<span class="s1">updateTitle(mDate.getTimeInMillis());</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">mDate.setTimeInMillis(date);</span>
<span class="s1">mDate.set(Calendar.SECOND, </span><span class="s3">0</span><span class="s1">);</span>
<span class="s1">mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());</span>
<span class="s1">setButton(context.getString(R.string.datetime_dialog_ok), </span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)</span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">set24HourView(DateFormat.is24HourFormat(</span><span class="s2">this</span><span class="s1">.getContext()));</span>
<span class="s1">updateTitle(mDate.getTimeInMillis());</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">set24HourView(</span><span class="s2">boolean </span><span class="s1">is24HourView) {</span>
<span class="s1">mIs24HourView = is24HourView;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setOnDateTimeSetListener(OnDateTimeSetListener callBack) {</span>
<span class="s1">mOnDateTimeSetListener = callBack;</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">updateTitle(</span><span class="s2">long </span><span class="s1">date) {</span>
<span class="s2">int </span><span class="s1">flag =</span>
<span class="s1">DateUtils.FORMAT_SHOW_YEAR |</span>
<span class="s1">DateUtils.FORMAT_SHOW_DATE |</span>
<span class="s1">DateUtils.FORMAT_SHOW_TIME;</span>
<span class="s1">flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;</span>
<span class="s1">setTitle(DateUtils.formatDateTime(</span><span class="s2">this</span><span class="s1">.getContext(), date, flag));</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">onClick(DialogInterface arg0, </span><span class="s2">int </span><span class="s1">arg1) {</span>
<span class="s2">if </span><span class="s1">(mOnDateTimeSetListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mOnDateTimeSetListener.OnDateTimeSet(</span><span class="s2">this</span><span class="s1">, mDate.getTimeInMillis());</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span></pre>
</body>
</html>

@ -0,0 +1,80 @@
<html>
<head>
<title>DropdownMenu.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
DropdownMenu.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.view.Menu;</span>
<span class="s2">import </span><span class="s1">android.view.MenuItem;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.view.View.OnClickListener;</span>
<span class="s2">import </span><span class="s1">android.widget.Button;</span>
<span class="s2">import </span><span class="s1">android.widget.PopupMenu;</span>
<span class="s2">import </span><span class="s1">android.widget.PopupMenu.OnMenuItemClickListener;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">public class </span><span class="s1">DropdownMenu {</span>
<span class="s2">private </span><span class="s1">Button mButton;</span>
<span class="s2">private </span><span class="s1">PopupMenu mPopupMenu;</span>
<span class="s2">private </span><span class="s1">Menu mMenu;</span>
<span class="s2">public </span><span class="s1">DropdownMenu(Context context, Button button, </span><span class="s2">int </span><span class="s1">menuId) {</span>
<span class="s1">mButton = button;</span>
<span class="s1">mButton.setBackgroundResource(R.drawable.dropdown_icon);</span>
<span class="s1">mPopupMenu = </span><span class="s2">new </span><span class="s1">PopupMenu(context, mButton);</span>
<span class="s1">mMenu = mPopupMenu.getMenu();</span>
<span class="s1">mPopupMenu.getMenuInflater().inflate(menuId, mMenu);</span>
<span class="s1">mButton.setOnClickListener(</span><span class="s2">new </span><span class="s1">OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(View v) {</span>
<span class="s1">mPopupMenu.show();</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) {</span>
<span class="s2">if </span><span class="s1">(mPopupMenu != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mPopupMenu.setOnMenuItemClickListener(listener);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">MenuItem findItem(</span><span class="s2">int </span><span class="s1">id) {</span>
<span class="s2">return </span><span class="s1">mMenu.findItem(id);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setTitle(CharSequence title) {</span>
<span class="s1">mButton.setText(title);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,100 @@
<html>
<head>
<title>FoldersListAdapter.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
FoldersListAdapter.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.view.ViewGroup;</span>
<span class="s2">import </span><span class="s1">android.widget.CursorAdapter;</span>
<span class="s2">import </span><span class="s1">android.widget.LinearLayout;</span>
<span class="s2">import </span><span class="s1">android.widget.TextView;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">public class </span><span class="s1">FoldersListAdapter </span><span class="s2">extends </span><span class="s1">CursorAdapter {</span>
<span class="s2">public static final </span><span class="s1">String [] PROJECTION = {</span>
<span class="s1">NoteColumns.ID,</span>
<span class="s1">NoteColumns.SNIPPET</span>
<span class="s1">};</span>
<span class="s2">public static final int </span><span class="s1">ID_COLUMN = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">NAME_COLUMN = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public </span><span class="s1">FoldersListAdapter(Context context, Cursor c) {</span>
<span class="s2">super</span><span class="s1">(context, c);</span>
<span class="s0">// TODO Auto-generated constructor stub</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">View newView(Context context, Cursor cursor, ViewGroup parent) {</span>
<span class="s2">return new </span><span class="s1">FolderListItem(context);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">bindView(View view, Context context, Cursor cursor) {</span>
<span class="s2">if </span><span class="s1">(view </span><span class="s2">instanceof </span><span class="s1">FolderListItem) {</span>
<span class="s1">String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context</span>
<span class="s1">.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);</span>
<span class="s1">((FolderListItem) view).bind(folderName);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getFolderName(Context context, </span><span class="s2">int </span><span class="s1">position) {</span>
<span class="s1">Cursor cursor = (Cursor) getItem(position);</span>
<span class="s2">return </span><span class="s1">(cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context</span>
<span class="s1">.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);</span>
<span class="s1">}</span>
<span class="s2">private class </span><span class="s1">FolderListItem </span><span class="s2">extends </span><span class="s1">LinearLayout {</span>
<span class="s2">private </span><span class="s1">TextView mName;</span>
<span class="s2">public </span><span class="s1">FolderListItem(Context context) {</span>
<span class="s2">super</span><span class="s1">(context);</span>
<span class="s1">inflate(context, R.layout.folder_list_item, </span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mName = (TextView) findViewById(R.id.tv_folder_name);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">bind(String name) {</span>
<span class="s1">mName.setText(name);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,239 @@
<html>
<head>
<title>NoteEditText.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NoteEditText.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.graphics.Rect;</span>
<span class="s2">import </span><span class="s1">android.text.Layout;</span>
<span class="s2">import </span><span class="s1">android.text.Selection;</span>
<span class="s2">import </span><span class="s1">android.text.Spanned;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.text.style.URLSpan;</span>
<span class="s2">import </span><span class="s1">android.util.AttributeSet;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">android.view.ContextMenu;</span>
<span class="s2">import </span><span class="s1">android.view.KeyEvent;</span>
<span class="s2">import </span><span class="s1">android.view.MenuItem;</span>
<span class="s2">import </span><span class="s1">android.view.MenuItem.OnMenuItemClickListener;</span>
<span class="s2">import </span><span class="s1">android.view.MotionEvent;</span>
<span class="s2">import </span><span class="s1">android.widget.EditText;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
<span class="s2">import </span><span class="s1">java.util.Map;</span>
<span class="s2">public class </span><span class="s1">NoteEditText </span><span class="s2">extends </span><span class="s1">EditText {</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NoteEditText&quot;</span><span class="s1">;</span>
<span class="s2">private int </span><span class="s1">mIndex;</span>
<span class="s2">private int </span><span class="s1">mSelectionStartBeforeDelete;</span>
<span class="s2">private static final </span><span class="s1">String SCHEME_TEL = </span><span class="s3">&quot;tel:&quot; </span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String SCHEME_HTTP = </span><span class="s3">&quot;http:&quot; </span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String SCHEME_EMAIL = </span><span class="s3">&quot;mailto:&quot; </span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">Map&lt;String, Integer&gt; sSchemaActionResMap = </span><span class="s2">new </span><span class="s1">HashMap&lt;String, Integer&gt;();</span>
<span class="s2">static </span><span class="s1">{</span>
<span class="s1">sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel);</span>
<span class="s1">sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web);</span>
<span class="s1">sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email);</span>
<span class="s1">}</span>
<span class="s0">/**</span>
<span class="s0">* Call by the {</span><span class="s4">@link </span><span class="s0">NoteEditActivity} to delete or add edit text</span>
<span class="s0">*/</span>
<span class="s2">public interface </span><span class="s1">OnTextViewChangeListener {</span>
<span class="s0">/**</span>
<span class="s0">* Delete current edit text when {</span><span class="s4">@link </span><span class="s0">KeyEvent#KEYCODE_DEL} happens</span>
<span class="s0">* and the text is null</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onEditTextDelete(</span><span class="s2">int </span><span class="s1">index, String text);</span>
<span class="s0">/**</span>
<span class="s0">* Add edit text after current edit text when {</span><span class="s4">@link </span><span class="s0">KeyEvent#KEYCODE_ENTER}</span>
<span class="s0">* happen</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onEditTextEnter(</span><span class="s2">int </span><span class="s1">index, String text);</span>
<span class="s0">/**</span>
<span class="s0">* Hide or show item option when text change</span>
<span class="s0">*/</span>
<span class="s2">void </span><span class="s1">onTextChange(</span><span class="s2">int </span><span class="s1">index, </span><span class="s2">boolean </span><span class="s1">hasText);</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">OnTextViewChangeListener mOnTextViewChangeListener;</span>
<span class="s2">public </span><span class="s1">NoteEditText(Context context) {</span>
<span class="s2">super</span><span class="s1">(context, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">mIndex = </span><span class="s5">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setIndex(</span><span class="s2">int </span><span class="s1">index) {</span>
<span class="s1">mIndex = index;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setOnTextViewChangeListener(OnTextViewChangeListener listener) {</span>
<span class="s1">mOnTextViewChangeListener = listener;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">NoteEditText(Context context, AttributeSet attrs) {</span>
<span class="s2">super</span><span class="s1">(context, attrs, android.R.attr.editTextStyle);</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">NoteEditText(Context context, AttributeSet attrs, </span><span class="s2">int </span><span class="s1">defStyle) {</span>
<span class="s2">super</span><span class="s1">(context, attrs, defStyle);</span>
<span class="s0">// TODO Auto-generated constructor stub</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onTouchEvent(MotionEvent event) {</span>
<span class="s2">switch </span><span class="s1">(event.getAction()) {</span>
<span class="s2">case </span><span class="s1">MotionEvent.ACTION_DOWN:</span>
<span class="s2">int </span><span class="s1">x = (</span><span class="s2">int</span><span class="s1">) event.getX();</span>
<span class="s2">int </span><span class="s1">y = (</span><span class="s2">int</span><span class="s1">) event.getY();</span>
<span class="s1">x -= getTotalPaddingLeft();</span>
<span class="s1">y -= getTotalPaddingTop();</span>
<span class="s1">x += getScrollX();</span>
<span class="s1">y += getScrollY();</span>
<span class="s1">Layout layout = getLayout();</span>
<span class="s2">int </span><span class="s1">line = layout.getLineForVertical(y);</span>
<span class="s2">int </span><span class="s1">off = layout.getOffsetForHorizontal(line, x);</span>
<span class="s1">Selection.setSelection(getText(), off);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return super</span><span class="s1">.onTouchEvent(event);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onKeyDown(</span><span class="s2">int </span><span class="s1">keyCode, KeyEvent event) {</span>
<span class="s2">switch </span><span class="s1">(keyCode) {</span>
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_ENTER:</span>
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_DEL:</span>
<span class="s1">mSelectionStartBeforeDelete = getSelectionStart();</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return super</span><span class="s1">.onKeyDown(keyCode, event);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public boolean </span><span class="s1">onKeyUp(</span><span class="s2">int </span><span class="s1">keyCode, KeyEvent event) {</span>
<span class="s2">switch</span><span class="s1">(keyCode) {</span>
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_DEL:</span>
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(</span><span class="s5">0 </span><span class="s1">== mSelectionStartBeforeDelete &amp;&amp; mIndex != </span><span class="s5">0</span><span class="s1">) {</span>
<span class="s1">mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString());</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;OnTextViewChangeListener was not seted&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">case </span><span class="s1">KeyEvent.KEYCODE_ENTER:</span>
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">int </span><span class="s1">selectionStart = getSelectionStart();</span>
<span class="s1">String text = getText().subSequence(selectionStart, length()).toString();</span>
<span class="s1">setText(getText().subSequence(</span><span class="s5">0</span><span class="s1">, selectionStart));</span>
<span class="s1">mOnTextViewChangeListener.onEditTextEnter(mIndex + </span><span class="s5">1</span><span class="s1">, text);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;OnTextViewChangeListener was not seted&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return super</span><span class="s1">.onKeyUp(keyCode, event);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onFocusChanged(</span><span class="s2">boolean </span><span class="s1">focused, </span><span class="s2">int </span><span class="s1">direction, Rect previouslyFocusedRect) {</span>
<span class="s2">if </span><span class="s1">(mOnTextViewChangeListener != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(!focused &amp;&amp; TextUtils.isEmpty(getText())) {</span>
<span class="s1">mOnTextViewChangeListener.onTextChange(mIndex, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mOnTextViewChangeListener.onTextChange(mIndex, </span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">super</span><span class="s1">.onFocusChanged(focused, direction, previouslyFocusedRect);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onCreateContextMenu(ContextMenu menu) {</span>
<span class="s2">if </span><span class="s1">(getText() </span><span class="s2">instanceof </span><span class="s1">Spanned) {</span>
<span class="s2">int </span><span class="s1">selStart = getSelectionStart();</span>
<span class="s2">int </span><span class="s1">selEnd = getSelectionEnd();</span>
<span class="s2">int </span><span class="s1">min = Math.min(selStart, selEnd);</span>
<span class="s2">int </span><span class="s1">max = Math.max(selStart, selEnd);</span>
<span class="s2">final </span><span class="s1">URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(urls.length == </span><span class="s5">1</span><span class="s1">) {</span>
<span class="s2">int </span><span class="s1">defaultResId = </span><span class="s5">0</span><span class="s1">;</span>
<span class="s2">for</span><span class="s1">(String schema: sSchemaActionResMap.keySet()) {</span>
<span class="s2">if</span><span class="s1">(urls[</span><span class="s5">0</span><span class="s1">].getURL().indexOf(schema) &gt;= </span><span class="s5">0</span><span class="s1">) {</span>
<span class="s1">defaultResId = sSchemaActionResMap.get(schema);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(defaultResId == </span><span class="s5">0</span><span class="s1">) {</span>
<span class="s1">defaultResId = R.string.note_link_other;</span>
<span class="s1">}</span>
<span class="s1">menu.add(</span><span class="s5">0</span><span class="s1">, </span><span class="s5">0</span><span class="s1">, </span><span class="s5">0</span><span class="s1">, defaultResId).setOnMenuItemClickListener(</span>
<span class="s2">new </span><span class="s1">OnMenuItemClickListener() {</span>
<span class="s2">public boolean </span><span class="s1">onMenuItemClick(MenuItem item) {</span>
<span class="s0">// goto a new intent</span>
<span class="s1">urls[</span><span class="s5">0</span><span class="s1">].onClick(NoteEditText.</span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">super</span><span class="s1">.onCreateContextMenu(menu);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,245 @@
<html>
<head>
<title>NoteItemData.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NoteItemData.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Contact;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.DataUtils;</span>
<span class="s2">public class </span><span class="s1">NoteItemData {</span>
<span class="s2">static final </span><span class="s1">String [] PROJECTION = </span><span class="s2">new </span><span class="s1">String [] {</span>
<span class="s1">NoteColumns.ID,</span>
<span class="s1">NoteColumns.ALERTED_DATE,</span>
<span class="s1">NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.CREATED_DATE,</span>
<span class="s1">NoteColumns.HAS_ATTACHMENT,</span>
<span class="s1">NoteColumns.MODIFIED_DATE,</span>
<span class="s1">NoteColumns.NOTES_COUNT,</span>
<span class="s1">NoteColumns.PARENT_ID,</span>
<span class="s1">NoteColumns.SNIPPET,</span>
<span class="s1">NoteColumns.TYPE,</span>
<span class="s1">NoteColumns.WIDGET_ID,</span>
<span class="s1">NoteColumns.WIDGET_TYPE,</span>
<span class="s1">};</span>
<span class="s2">private static final int </span><span class="s1">ID_COLUMN = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">ALERTED_DATE_COLUMN = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">BG_COLOR_ID_COLUMN = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">CREATED_DATE_COLUMN = </span><span class="s3">3</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">HAS_ATTACHMENT_COLUMN = </span><span class="s3">4</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">MODIFIED_DATE_COLUMN = </span><span class="s3">5</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">NOTES_COUNT_COLUMN = </span><span class="s3">6</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">PARENT_ID_COLUMN = </span><span class="s3">7</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">SNIPPET_COLUMN = </span><span class="s3">8</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">TYPE_COLUMN = </span><span class="s3">9</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">WIDGET_ID_COLUMN = </span><span class="s3">10</span><span class="s1">;</span>
<span class="s2">private static final int </span><span class="s1">WIDGET_TYPE_COLUMN = </span><span class="s3">11</span><span class="s1">;</span>
<span class="s2">private long </span><span class="s1">mId;</span>
<span class="s2">private long </span><span class="s1">mAlertDate;</span>
<span class="s2">private int </span><span class="s1">mBgColorId;</span>
<span class="s2">private long </span><span class="s1">mCreatedDate;</span>
<span class="s2">private boolean </span><span class="s1">mHasAttachment;</span>
<span class="s2">private long </span><span class="s1">mModifiedDate;</span>
<span class="s2">private int </span><span class="s1">mNotesCount;</span>
<span class="s2">private long </span><span class="s1">mParentId;</span>
<span class="s2">private </span><span class="s1">String mSnippet;</span>
<span class="s2">private int </span><span class="s1">mType;</span>
<span class="s2">private int </span><span class="s1">mWidgetId;</span>
<span class="s2">private int </span><span class="s1">mWidgetType;</span>
<span class="s2">private </span><span class="s1">String mName;</span>
<span class="s2">private </span><span class="s1">String mPhoneNumber;</span>
<span class="s2">private boolean </span><span class="s1">mIsLastItem;</span>
<span class="s2">private boolean </span><span class="s1">mIsFirstItem;</span>
<span class="s2">private boolean </span><span class="s1">mIsOnlyOneItem;</span>
<span class="s2">private boolean </span><span class="s1">mIsOneNoteFollowingFolder;</span>
<span class="s2">private boolean </span><span class="s1">mIsMultiNotesFollowingFolder;</span>
<span class="s2">public </span><span class="s1">NoteItemData(Context context, Cursor cursor) {</span>
<span class="s1">mId = cursor.getLong(ID_COLUMN);</span>
<span class="s1">mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN);</span>
<span class="s1">mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);</span>
<span class="s1">mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN);</span>
<span class="s1">mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) &gt; </span><span class="s3">0</span><span class="s1">) ? </span><span class="s2">true </span><span class="s1">: </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN);</span>
<span class="s1">mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);</span>
<span class="s1">mParentId = cursor.getLong(PARENT_ID_COLUMN);</span>
<span class="s1">mSnippet = cursor.getString(SNIPPET_COLUMN);</span>
<span class="s1">mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, </span><span class="s4">&quot;&quot;</span><span class="s1">).replace(</span>
<span class="s1">NoteEditActivity.TAG_UNCHECKED, </span><span class="s4">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">mType = cursor.getInt(TYPE_COLUMN);</span>
<span class="s1">mWidgetId = cursor.getInt(WIDGET_ID_COLUMN);</span>
<span class="s1">mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN);</span>
<span class="s1">mPhoneNumber = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mParentId == Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId);</span>
<span class="s2">if </span><span class="s1">(!TextUtils.isEmpty(mPhoneNumber)) {</span>
<span class="s1">mName = Contact.getContact(context, mPhoneNumber);</span>
<span class="s2">if </span><span class="s1">(mName == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mName = mPhoneNumber;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(mName == </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">mName = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">checkPostion(cursor);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">checkPostion(Cursor cursor) {</span>
<span class="s1">mIsLastItem = cursor.isLast() ? </span><span class="s2">true </span><span class="s1">: </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mIsFirstItem = cursor.isFirst() ? </span><span class="s2">true </span><span class="s1">: </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mIsOnlyOneItem = (cursor.getCount() == </span><span class="s3">1</span><span class="s1">);</span>
<span class="s1">mIsMultiNotesFollowingFolder = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s1">mIsOneNoteFollowingFolder = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(mType == Notes.TYPE_NOTE &amp;&amp; !mIsFirstItem) {</span>
<span class="s2">int </span><span class="s1">position = cursor.getPosition();</span>
<span class="s2">if </span><span class="s1">(cursor.moveToPrevious()) {</span>
<span class="s2">if </span><span class="s1">(cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER</span>
<span class="s1">|| cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {</span>
<span class="s2">if </span><span class="s1">(cursor.getCount() &gt; (position + </span><span class="s3">1</span><span class="s1">)) {</span>
<span class="s1">mIsMultiNotesFollowingFolder = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mIsOneNoteFollowingFolder = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!cursor.moveToNext()) {</span>
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">&quot;cursor move to previous but can't move back&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isOneFollowingFolder() {</span>
<span class="s2">return </span><span class="s1">mIsOneNoteFollowingFolder;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isMultiFollowingFolder() {</span>
<span class="s2">return </span><span class="s1">mIsMultiNotesFollowingFolder;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isLast() {</span>
<span class="s2">return </span><span class="s1">mIsLastItem;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getCallName() {</span>
<span class="s2">return </span><span class="s1">mName;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isFirst() {</span>
<span class="s2">return </span><span class="s1">mIsFirstItem;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isSingle() {</span>
<span class="s2">return </span><span class="s1">mIsOnlyOneItem;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getId() {</span>
<span class="s2">return </span><span class="s1">mId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getAlertDate() {</span>
<span class="s2">return </span><span class="s1">mAlertDate;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getCreatedDate() {</span>
<span class="s2">return </span><span class="s1">mCreatedDate;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">hasAttachment() {</span>
<span class="s2">return </span><span class="s1">mHasAttachment;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getModifiedDate() {</span>
<span class="s2">return </span><span class="s1">mModifiedDate;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getBgColorId() {</span>
<span class="s2">return </span><span class="s1">mBgColorId;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getParentId() {</span>
<span class="s2">return </span><span class="s1">mParentId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getNotesCount() {</span>
<span class="s2">return </span><span class="s1">mNotesCount;</span>
<span class="s1">}</span>
<span class="s2">public long </span><span class="s1">getFolderId () {</span>
<span class="s2">return </span><span class="s1">mParentId;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getType() {</span>
<span class="s2">return </span><span class="s1">mType;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetType() {</span>
<span class="s2">return </span><span class="s1">mWidgetType;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getWidgetId() {</span>
<span class="s2">return </span><span class="s1">mWidgetId;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">String getSnippet() {</span>
<span class="s2">return </span><span class="s1">mSnippet;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">hasAlert() {</span>
<span class="s2">return </span><span class="s1">(mAlertDate &gt; </span><span class="s3">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isCallRecord() {</span>
<span class="s2">return </span><span class="s1">(mParentId == Notes.ID_CALL_RECORD_FOLDER &amp;&amp; !TextUtils.isEmpty(mPhoneNumber));</span>
<span class="s1">}</span>
<span class="s2">public static int </span><span class="s1">getNoteType(Cursor cursor) {</span>
<span class="s2">return </span><span class="s1">cursor.getInt(TYPE_COLUMN);</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,205 @@
<html>
<head>
<title>NotesListAdapter.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NotesListAdapter.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.view.ViewGroup;</span>
<span class="s2">import </span><span class="s1">android.widget.CursorAdapter;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">java.util.Collection;</span>
<span class="s2">import </span><span class="s1">java.util.HashMap;</span>
<span class="s2">import </span><span class="s1">java.util.HashSet;</span>
<span class="s2">import </span><span class="s1">java.util.Iterator;</span>
<span class="s2">public class </span><span class="s1">NotesListAdapter </span><span class="s2">extends </span><span class="s1">CursorAdapter {</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">&quot;NotesListAdapter&quot;</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">Context mContext;</span>
<span class="s2">private </span><span class="s1">HashMap&lt;Integer, Boolean&gt; mSelectedIndex;</span>
<span class="s2">private int </span><span class="s1">mNotesCount;</span>
<span class="s2">private boolean </span><span class="s1">mChoiceMode;</span>
<span class="s2">public static class </span><span class="s1">AppWidgetAttribute {</span>
<span class="s2">public int </span><span class="s1">widgetId;</span>
<span class="s2">public int </span><span class="s1">widgetType;</span>
<span class="s1">};</span>
<span class="s2">public </span><span class="s1">NotesListAdapter(Context context) {</span>
<span class="s2">super</span><span class="s1">(context, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">mSelectedIndex = </span><span class="s2">new </span><span class="s1">HashMap&lt;Integer, Boolean&gt;();</span>
<span class="s1">mContext = context;</span>
<span class="s1">mNotesCount = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public </span><span class="s1">View newView(Context context, Cursor cursor, ViewGroup parent) {</span>
<span class="s2">return new </span><span class="s1">NotesListItem(context);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">bindView(View view, Context context, Cursor cursor) {</span>
<span class="s2">if </span><span class="s1">(view </span><span class="s2">instanceof </span><span class="s1">NotesListItem) {</span>
<span class="s1">NoteItemData itemData = </span><span class="s2">new </span><span class="s1">NoteItemData(context, cursor);</span>
<span class="s1">((NotesListItem) view).bind(context, itemData, mChoiceMode,</span>
<span class="s1">isSelectedItem(cursor.getPosition()));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setCheckedItem(</span><span class="s2">final int </span><span class="s1">position, </span><span class="s2">final boolean </span><span class="s1">checked) {</span>
<span class="s1">mSelectedIndex.put(position, checked);</span>
<span class="s1">notifyDataSetChanged();</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isInChoiceMode() {</span>
<span class="s2">return </span><span class="s1">mChoiceMode;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">setChoiceMode(</span><span class="s2">boolean </span><span class="s1">mode) {</span>
<span class="s1">mSelectedIndex.clear();</span>
<span class="s1">mChoiceMode = mode;</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">selectAll(</span><span class="s2">boolean </span><span class="s1">checked) {</span>
<span class="s1">Cursor cursor = getCursor();</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; getCount(); i++) {</span>
<span class="s2">if </span><span class="s1">(cursor.moveToPosition(i)) {</span>
<span class="s2">if </span><span class="s1">(NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) {</span>
<span class="s1">setCheckedItem(i, checked);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">HashSet&lt;Long&gt; getSelectedItemIds() {</span>
<span class="s1">HashSet&lt;Long&gt; itemSet = </span><span class="s2">new </span><span class="s1">HashSet&lt;Long&gt;();</span>
<span class="s2">for </span><span class="s1">(Integer position : mSelectedIndex.keySet()) {</span>
<span class="s2">if </span><span class="s1">(mSelectedIndex.get(position) == </span><span class="s2">true</span><span class="s1">) {</span>
<span class="s1">Long id = getItemId(position);</span>
<span class="s2">if </span><span class="s1">(id == Notes.ID_ROOT_FOLDER) {</span>
<span class="s1">Log.d(TAG, </span><span class="s3">&quot;Wrong item id, should not happen&quot;</span><span class="s1">);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">itemSet.add(id);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">itemSet;</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">HashSet&lt;AppWidgetAttribute&gt; getSelectedWidget() {</span>
<span class="s1">HashSet&lt;AppWidgetAttribute&gt; itemSet = </span><span class="s2">new </span><span class="s1">HashSet&lt;AppWidgetAttribute&gt;();</span>
<span class="s2">for </span><span class="s1">(Integer position : mSelectedIndex.keySet()) {</span>
<span class="s2">if </span><span class="s1">(mSelectedIndex.get(position) == </span><span class="s2">true</span><span class="s1">) {</span>
<span class="s1">Cursor c = (Cursor) getItem(position);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">AppWidgetAttribute widget = </span><span class="s2">new </span><span class="s1">AppWidgetAttribute();</span>
<span class="s1">NoteItemData item = </span><span class="s2">new </span><span class="s1">NoteItemData(mContext, c);</span>
<span class="s1">widget.widgetId = item.getWidgetId();</span>
<span class="s1">widget.widgetType = item.getWidgetType();</span>
<span class="s1">itemSet.add(widget);</span>
<span class="s0">/**</span>
<span class="s0">* Don't close cursor here, only the adapter could close it</span>
<span class="s0">*/</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Invalid cursor&quot;</span><span class="s1">);</span>
<span class="s2">return null</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">itemSet;</span>
<span class="s1">}</span>
<span class="s2">public int </span><span class="s1">getSelectedCount() {</span>
<span class="s1">Collection&lt;Boolean&gt; values = mSelectedIndex.values();</span>
<span class="s2">if </span><span class="s1">(</span><span class="s2">null </span><span class="s1">== values) {</span>
<span class="s2">return </span><span class="s4">0</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">Iterator&lt;Boolean&gt; iter = values.iterator();</span>
<span class="s2">int </span><span class="s1">count = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
<span class="s2">if </span><span class="s1">(</span><span class="s2">true </span><span class="s1">== iter.next()) {</span>
<span class="s1">count++;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">count;</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isAllSelected() {</span>
<span class="s2">int </span><span class="s1">checkedCount = getSelectedCount();</span>
<span class="s2">return </span><span class="s1">(checkedCount != </span><span class="s4">0 </span><span class="s1">&amp;&amp; checkedCount == mNotesCount);</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">isSelectedItem(</span><span class="s2">final int </span><span class="s1">position) {</span>
<span class="s2">if </span><span class="s1">(</span><span class="s2">null </span><span class="s1">== mSelectedIndex.get(position)) {</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s2">return </span><span class="s1">mSelectedIndex.get(position);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onContentChanged() {</span>
<span class="s2">super</span><span class="s1">.onContentChanged();</span>
<span class="s1">calcNotesCount();</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">changeCursor(Cursor cursor) {</span>
<span class="s2">super</span><span class="s1">.changeCursor(cursor);</span>
<span class="s1">calcNotesCount();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">calcNotesCount() {</span>
<span class="s1">mNotesCount = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s4">0</span><span class="s1">; i &lt; getCount(); i++) {</span>
<span class="s1">Cursor c = (Cursor) getItem(i);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s2">if </span><span class="s1">(NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) {</span>
<span class="s1">mNotesCount++;</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Log.e(TAG, </span><span class="s3">&quot;Invalid cursor&quot;</span><span class="s1">);</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,141 @@
<html>
<head>
<title>NotesListItem.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NotesListItem.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateUtils;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.widget.CheckBox;</span>
<span class="s2">import </span><span class="s1">android.widget.ImageView;</span>
<span class="s2">import </span><span class="s1">android.widget.LinearLayout;</span>
<span class="s2">import </span><span class="s1">android.widget.TextView;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.DataUtils;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser.NoteItemBgResources;</span>
<span class="s2">public class </span><span class="s1">NotesListItem </span><span class="s2">extends </span><span class="s1">LinearLayout {</span>
<span class="s2">private </span><span class="s1">ImageView mAlert;</span>
<span class="s2">private </span><span class="s1">TextView mTitle;</span>
<span class="s2">private </span><span class="s1">TextView mTime;</span>
<span class="s2">private </span><span class="s1">TextView mCallName;</span>
<span class="s2">private </span><span class="s1">NoteItemData mItemData;</span>
<span class="s2">private </span><span class="s1">CheckBox mCheckBox;</span>
<span class="s2">public </span><span class="s1">NotesListItem(Context context) {</span>
<span class="s2">super</span><span class="s1">(context);</span>
<span class="s1">inflate(context, R.layout.note_item, </span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mAlert = (ImageView) findViewById(R.id.iv_alert_icon);</span>
<span class="s1">mTitle = (TextView) findViewById(R.id.tv_title);</span>
<span class="s1">mTime = (TextView) findViewById(R.id.tv_time);</span>
<span class="s1">mCallName = (TextView) findViewById(R.id.tv_name);</span>
<span class="s1">mCheckBox = (CheckBox) findViewById(android.R.id.checkbox);</span>
<span class="s1">}</span>
<span class="s2">public void </span><span class="s1">bind(Context context, NoteItemData data, </span><span class="s2">boolean </span><span class="s1">choiceMode, </span><span class="s2">boolean </span><span class="s1">checked) {</span>
<span class="s2">if </span><span class="s1">(choiceMode &amp;&amp; data.getType() == Notes.TYPE_NOTE) {</span>
<span class="s1">mCheckBox.setVisibility(View.VISIBLE);</span>
<span class="s1">mCheckBox.setChecked(checked);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mCheckBox.setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">mItemData = data;</span>
<span class="s2">if </span><span class="s1">(data.getId() == Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">mCallName.setVisibility(View.GONE);</span>
<span class="s1">mAlert.setVisibility(View.VISIBLE);</span>
<span class="s1">mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);</span>
<span class="s1">mTitle.setText(context.getString(R.string.call_record_folder_name)</span>
<span class="s1">+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));</span>
<span class="s1">mAlert.setImageResource(R.drawable.call_record);</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {</span>
<span class="s1">mCallName.setVisibility(View.VISIBLE);</span>
<span class="s1">mCallName.setText(data.getCallName());</span>
<span class="s1">mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);</span>
<span class="s1">mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));</span>
<span class="s2">if </span><span class="s1">(data.hasAlert()) {</span>
<span class="s1">mAlert.setImageResource(R.drawable.clock);</span>
<span class="s1">mAlert.setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mAlert.setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mCallName.setVisibility(View.GONE);</span>
<span class="s1">mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);</span>
<span class="s2">if </span><span class="s1">(data.getType() == Notes.TYPE_FOLDER) {</span>
<span class="s1">mTitle.setText(data.getSnippet()</span>
<span class="s1">+ context.getString(R.string.format_folder_files_count,</span>
<span class="s1">data.getNotesCount()));</span>
<span class="s1">mAlert.setVisibility(View.GONE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));</span>
<span class="s2">if </span><span class="s1">(data.hasAlert()) {</span>
<span class="s1">mAlert.setImageResource(R.drawable.clock);</span>
<span class="s1">mAlert.setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">mAlert.setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));</span>
<span class="s1">setBackground(data);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">setBackground(NoteItemData data) {</span>
<span class="s2">int </span><span class="s1">id = data.getBgColorId();</span>
<span class="s2">if </span><span class="s1">(data.getType() == Notes.TYPE_NOTE) {</span>
<span class="s2">if </span><span class="s1">(data.isSingle() || data.isOneFollowingFolder()) {</span>
<span class="s1">setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(data.isLast()) {</span>
<span class="s1">setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(data.isFirst() || data.isMultiFollowingFolder()) {</span>
<span class="s1">setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">setBackgroundResource(NoteItemBgResources.getFolderBgRes());</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public </span><span class="s1">NoteItemData getItemData() {</span>
<span class="s2">return </span><span class="s1">mItemData;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,409 @@
<html>
<head>
<title>NotesPreferenceActivity.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #067d17;}
.s4 { color: #1750eb;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NotesPreferenceActivity.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.ui;</span>
<span class="s2">import </span><span class="s1">android.accounts.Account;</span>
<span class="s2">import </span><span class="s1">android.accounts.AccountManager;</span>
<span class="s2">import </span><span class="s1">android.app.ActionBar;</span>
<span class="s2">import </span><span class="s1">android.app.AlertDialog;</span>
<span class="s2">import </span><span class="s1">android.content.BroadcastReceiver;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.DialogInterface;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.content.IntentFilter;</span>
<span class="s2">import </span><span class="s1">android.content.SharedPreferences;</span>
<span class="s2">import </span><span class="s1">android.os.Bundle;</span>
<span class="s2">import </span><span class="s1">android.preference.Preference;</span>
<span class="s2">import </span><span class="s1">android.preference.Preference.OnPreferenceClickListener;</span>
<span class="s2">import </span><span class="s1">android.preference.PreferenceActivity;</span>
<span class="s2">import </span><span class="s1">android.preference.PreferenceCategory;</span>
<span class="s2">import </span><span class="s1">android.text.TextUtils;</span>
<span class="s2">import </span><span class="s1">android.text.format.DateFormat;</span>
<span class="s2">import </span><span class="s1">android.view.LayoutInflater;</span>
<span class="s2">import </span><span class="s1">android.view.Menu;</span>
<span class="s2">import </span><span class="s1">android.view.MenuItem;</span>
<span class="s2">import </span><span class="s1">android.view.View;</span>
<span class="s2">import </span><span class="s1">android.widget.Button;</span>
<span class="s2">import </span><span class="s1">android.widget.TextView;</span>
<span class="s2">import </span><span class="s1">android.widget.Toast;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.gtask.remote.GTaskSyncService;</span>
<span class="s2">public class </span><span class="s1">NotesPreferenceActivity </span><span class="s2">extends </span><span class="s1">PreferenceActivity {</span>
<span class="s2">public static final </span><span class="s1">String PREFERENCE_NAME = </span><span class="s3">&quot;notes_preferences&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String PREFERENCE_SYNC_ACCOUNT_NAME = </span><span class="s3">&quot;pref_key_account_name&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String PREFERENCE_LAST_SYNC_TIME = </span><span class="s3">&quot;pref_last_sync_time&quot;</span><span class="s1">;</span>
<span class="s2">public static final </span><span class="s1">String PREFERENCE_SET_BG_COLOR_KEY = </span><span class="s3">&quot;pref_key_bg_random_appear&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String PREFERENCE_SYNC_ACCOUNT_KEY = </span><span class="s3">&quot;pref_sync_account_key&quot;</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String AUTHORITIES_FILTER_KEY = </span><span class="s3">&quot;authorities&quot;</span><span class="s1">;</span>
<span class="s2">private </span><span class="s1">PreferenceCategory mAccountCategory;</span>
<span class="s2">private </span><span class="s1">GTaskReceiver mReceiver;</span>
<span class="s2">private </span><span class="s1">Account[] mOriAccounts;</span>
<span class="s2">private boolean </span><span class="s1">mHasAddedAccount;</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onCreate(Bundle icicle) {</span>
<span class="s2">super</span><span class="s1">.onCreate(icicle);</span>
<span class="s0">/* using the app icon for navigation */</span>
<span class="s1">getActionBar().setDisplayHomeAsUpEnabled(</span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">addPreferencesFromResource(R.xml.preferences);</span>
<span class="s1">mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);</span>
<span class="s1">mReceiver = </span><span class="s2">new </span><span class="s1">GTaskReceiver();</span>
<span class="s1">IntentFilter filter = </span><span class="s2">new </span><span class="s1">IntentFilter();</span>
<span class="s1">filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME);</span>
<span class="s1">registerReceiver(mReceiver, filter);</span>
<span class="s1">mOriAccounts = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s1">View header = LayoutInflater.from(</span><span class="s2">this</span><span class="s1">).inflate(R.layout.settings_header, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">getListView().addHeaderView(header, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">true</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onResume() {</span>
<span class="s2">super</span><span class="s1">.onResume();</span>
<span class="s0">// need to set sync account automatically if user has added a new</span>
<span class="s0">// account</span>
<span class="s2">if </span><span class="s1">(mHasAddedAccount) {</span>
<span class="s1">Account[] accounts = getGoogleAccounts();</span>
<span class="s2">if </span><span class="s1">(mOriAccounts != </span><span class="s2">null </span><span class="s1">&amp;&amp; accounts.length &gt; mOriAccounts.length) {</span>
<span class="s2">for </span><span class="s1">(Account accountNew : accounts) {</span>
<span class="s2">boolean </span><span class="s1">found = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(Account accountOld : mOriAccounts) {</span>
<span class="s2">if </span><span class="s1">(TextUtils.equals(accountOld.name, accountNew.name)) {</span>
<span class="s1">found = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(!found) {</span>
<span class="s1">setSyncAccount(accountNew.name);</span>
<span class="s2">break</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">refreshUI();</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected void </span><span class="s1">onDestroy() {</span>
<span class="s2">if </span><span class="s1">(mReceiver != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">unregisterReceiver(mReceiver);</span>
<span class="s1">}</span>
<span class="s2">super</span><span class="s1">.onDestroy();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadAccountPreference() {</span>
<span class="s1">mAccountCategory.removeAll();</span>
<span class="s1">Preference accountPref = </span><span class="s2">new </span><span class="s1">Preference(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">final </span><span class="s1">String defaultAccount = getSyncAccountName(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">accountPref.setTitle(getString(R.string.preferences_account_title));</span>
<span class="s1">accountPref.setSummary(getString(R.string.preferences_account_summary));</span>
<span class="s1">accountPref.setOnPreferenceClickListener(</span><span class="s2">new </span><span class="s1">OnPreferenceClickListener() {</span>
<span class="s2">public boolean </span><span class="s1">onPreferenceClick(Preference preference) {</span>
<span class="s2">if </span><span class="s1">(!GTaskSyncService.isSyncing()) {</span>
<span class="s2">if </span><span class="s1">(TextUtils.isEmpty(defaultAccount)) {</span>
<span class="s0">// the first time to set account</span>
<span class="s1">showSelectAccountAlertDialog();</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s0">// if the account has already been set, we need to promp</span>
<span class="s0">// user about the risk</span>
<span class="s1">showChangeAccountConfirmAlertDialog();</span>
<span class="s1">}</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">Toast.makeText(NotesPreferenceActivity.</span><span class="s2">this</span><span class="s1">,</span>
<span class="s1">R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT)</span>
<span class="s1">.show();</span>
<span class="s1">}</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">mAccountCategory.addPreference(accountPref);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">loadSyncButton() {</span>
<span class="s1">Button syncButton = (Button) findViewById(R.id.preference_sync_button);</span>
<span class="s1">TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview);</span>
<span class="s0">// set button state</span>
<span class="s2">if </span><span class="s1">(GTaskSyncService.isSyncing()) {</span>
<span class="s1">syncButton.setText(getString(R.string.preferences_button_sync_cancel));</span>
<span class="s1">syncButton.setOnClickListener(</span><span class="s2">new </span><span class="s1">View.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(View v) {</span>
<span class="s1">GTaskSyncService.cancelSync(NotesPreferenceActivity.</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">syncButton.setText(getString(R.string.preferences_button_sync_immediately));</span>
<span class="s1">syncButton.setOnClickListener(</span><span class="s2">new </span><span class="s1">View.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(View v) {</span>
<span class="s1">GTaskSyncService.startSync(NotesPreferenceActivity.</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s1">syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(</span><span class="s2">this</span><span class="s1">)));</span>
<span class="s0">// set last sync time</span>
<span class="s2">if </span><span class="s1">(GTaskSyncService.isSyncing()) {</span>
<span class="s1">lastSyncTimeView.setText(GTaskSyncService.getProgressString());</span>
<span class="s1">lastSyncTimeView.setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s2">long </span><span class="s1">lastSyncTime = getLastSyncTime(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">if </span><span class="s1">(lastSyncTime != </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time,</span>
<span class="s1">DateFormat.format(getString(R.string.preferences_last_sync_time_format),</span>
<span class="s1">lastSyncTime)));</span>
<span class="s1">lastSyncTimeView.setVisibility(View.VISIBLE);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">lastSyncTimeView.setVisibility(View.GONE);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">refreshUI() {</span>
<span class="s1">loadAccountPreference();</span>
<span class="s1">loadSyncButton();</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showSelectAccountAlertDialog() {</span>
<span class="s1">AlertDialog.Builder dialogBuilder = </span><span class="s2">new </span><span class="s1">AlertDialog.Builder(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">View titleView = LayoutInflater.from(</span><span class="s2">this</span><span class="s1">).inflate(R.layout.account_dialog_title, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);</span>
<span class="s1">titleTextView.setText(getString(R.string.preferences_dialog_select_account_title));</span>
<span class="s1">TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);</span>
<span class="s1">subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips));</span>
<span class="s1">dialogBuilder.setCustomTitle(titleView);</span>
<span class="s1">dialogBuilder.setPositiveButton(</span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">Account[] accounts = getGoogleAccounts();</span>
<span class="s1">String defAccount = getSyncAccountName(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">mOriAccounts = accounts;</span>
<span class="s1">mHasAddedAccount = </span><span class="s2">false</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(accounts.length &gt; </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">CharSequence[] items = </span><span class="s2">new </span><span class="s1">CharSequence[accounts.length];</span>
<span class="s2">final </span><span class="s1">CharSequence[] itemMapping = items;</span>
<span class="s2">int </span><span class="s1">checkedItem = -</span><span class="s4">1</span><span class="s1">;</span>
<span class="s2">int </span><span class="s1">index = </span><span class="s4">0</span><span class="s1">;</span>
<span class="s2">for </span><span class="s1">(Account account : accounts) {</span>
<span class="s2">if </span><span class="s1">(TextUtils.equals(account.name, defAccount)) {</span>
<span class="s1">checkedItem = index;</span>
<span class="s1">}</span>
<span class="s1">items[index++] = account.name;</span>
<span class="s1">}</span>
<span class="s1">dialogBuilder.setSingleChoiceItems(items, checkedItem,</span>
<span class="s2">new </span><span class="s1">DialogInterface.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(DialogInterface dialog, </span><span class="s2">int </span><span class="s1">which) {</span>
<span class="s1">setSyncAccount(itemMapping[which].toString());</span>
<span class="s1">dialog.dismiss();</span>
<span class="s1">refreshUI();</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s1">View addAccountView = LayoutInflater.from(</span><span class="s2">this</span><span class="s1">).inflate(R.layout.add_account_text, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">dialogBuilder.setView(addAccountView);</span>
<span class="s2">final </span><span class="s1">AlertDialog dialog = dialogBuilder.show();</span>
<span class="s1">addAccountView.setOnClickListener(</span><span class="s2">new </span><span class="s1">View.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(View v) {</span>
<span class="s1">mHasAddedAccount = </span><span class="s2">true</span><span class="s1">;</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s3">&quot;android.settings.ADD_ACCOUNT_SETTINGS&quot;</span><span class="s1">);</span>
<span class="s1">intent.putExtra(AUTHORITIES_FILTER_KEY, </span><span class="s2">new </span><span class="s1">String[] {</span>
<span class="s3">&quot;gmail-ls&quot;</span>
<span class="s1">});</span>
<span class="s1">startActivityForResult(intent, -</span><span class="s4">1</span><span class="s1">);</span>
<span class="s1">dialog.dismiss();</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">showChangeAccountConfirmAlertDialog() {</span>
<span class="s1">AlertDialog.Builder dialogBuilder = </span><span class="s2">new </span><span class="s1">AlertDialog.Builder(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s1">View titleView = LayoutInflater.from(</span><span class="s2">this</span><span class="s1">).inflate(R.layout.account_dialog_title, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);</span>
<span class="s1">titleTextView.setText(getString(R.string.preferences_dialog_change_account_title,</span>
<span class="s1">getSyncAccountName(</span><span class="s2">this</span><span class="s1">)));</span>
<span class="s1">TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);</span>
<span class="s1">subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg));</span>
<span class="s1">dialogBuilder.setCustomTitle(titleView);</span>
<span class="s1">CharSequence[] menuItemArray = </span><span class="s2">new </span><span class="s1">CharSequence[] {</span>
<span class="s1">getString(R.string.preferences_menu_change_account),</span>
<span class="s1">getString(R.string.preferences_menu_remove_account),</span>
<span class="s1">getString(R.string.preferences_menu_cancel)</span>
<span class="s1">};</span>
<span class="s1">dialogBuilder.setItems(menuItemArray, </span><span class="s2">new </span><span class="s1">DialogInterface.OnClickListener() {</span>
<span class="s2">public void </span><span class="s1">onClick(DialogInterface dialog, </span><span class="s2">int </span><span class="s1">which) {</span>
<span class="s2">if </span><span class="s1">(which == </span><span class="s4">0</span><span class="s1">) {</span>
<span class="s1">showSelectAccountAlertDialog();</span>
<span class="s1">} </span><span class="s2">else if </span><span class="s1">(which == </span><span class="s4">1</span><span class="s1">) {</span>
<span class="s1">removeSyncAccount();</span>
<span class="s1">refreshUI();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">});</span>
<span class="s1">dialogBuilder.show();</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">Account[] getGoogleAccounts() {</span>
<span class="s1">AccountManager accountManager = AccountManager.get(</span><span class="s2">this</span><span class="s1">);</span>
<span class="s2">return </span><span class="s1">accountManager.getAccountsByType(</span><span class="s3">&quot;com.google&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">setSyncAccount(String account) {</span>
<span class="s2">if </span><span class="s1">(!getSyncAccountName(</span><span class="s2">this</span><span class="s1">).equals(account)) {</span>
<span class="s1">SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);</span>
<span class="s1">SharedPreferences.Editor editor = settings.edit();</span>
<span class="s2">if </span><span class="s1">(account != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">editor.commit();</span>
<span class="s0">// clean up last sync time</span>
<span class="s1">setLastSyncTime(</span><span class="s2">this</span><span class="s1">, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s0">// clean up local gtask related info</span>
<span class="s2">new </span><span class="s1">Thread(</span><span class="s2">new </span><span class="s1">Runnable() {</span>
<span class="s2">public void </span><span class="s1">run() {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.GTASK_ID, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">values.put(NoteColumns.SYNC_ID, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">getContentResolver().update(Notes.CONTENT_NOTE_URI, values, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}).start();</span>
<span class="s1">Toast.makeText(NotesPreferenceActivity.</span><span class="s2">this</span><span class="s1">,</span>
<span class="s1">getString(R.string.preferences_toast_success_set_accout, account),</span>
<span class="s1">Toast.LENGTH_SHORT).show();</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">removeSyncAccount() {</span>
<span class="s1">SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);</span>
<span class="s1">SharedPreferences.Editor editor = settings.edit();</span>
<span class="s2">if </span><span class="s1">(settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) {</span>
<span class="s1">editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(settings.contains(PREFERENCE_LAST_SYNC_TIME)) {</span>
<span class="s1">editor.remove(PREFERENCE_LAST_SYNC_TIME);</span>
<span class="s1">}</span>
<span class="s1">editor.commit();</span>
<span class="s0">// clean up local gtask related info</span>
<span class="s2">new </span><span class="s1">Thread(</span><span class="s2">new </span><span class="s1">Runnable() {</span>
<span class="s2">public void </span><span class="s1">run() {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.GTASK_ID, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">values.put(NoteColumns.SYNC_ID, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">getContentResolver().update(Notes.CONTENT_NOTE_URI, values, </span><span class="s2">null</span><span class="s1">, </span><span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s1">}).start();</span>
<span class="s1">}</span>
<span class="s2">public static </span><span class="s1">String getSyncAccountName(Context context) {</span>
<span class="s1">SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,</span>
<span class="s1">Context.MODE_PRIVATE);</span>
<span class="s2">return </span><span class="s1">settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, </span><span class="s3">&quot;&quot;</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">public static void </span><span class="s1">setLastSyncTime(Context context, </span><span class="s2">long </span><span class="s1">time) {</span>
<span class="s1">SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,</span>
<span class="s1">Context.MODE_PRIVATE);</span>
<span class="s1">SharedPreferences.Editor editor = settings.edit();</span>
<span class="s1">editor.putLong(PREFERENCE_LAST_SYNC_TIME, time);</span>
<span class="s1">editor.commit();</span>
<span class="s1">}</span>
<span class="s2">public static long </span><span class="s1">getLastSyncTime(Context context) {</span>
<span class="s1">SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,</span>
<span class="s1">Context.MODE_PRIVATE);</span>
<span class="s2">return </span><span class="s1">settings.getLong(PREFERENCE_LAST_SYNC_TIME, </span><span class="s4">0</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private class </span><span class="s1">GTaskReceiver </span><span class="s2">extends </span><span class="s1">BroadcastReceiver {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onReceive(Context context, Intent intent) {</span>
<span class="s1">refreshUI();</span>
<span class="s2">if </span><span class="s1">(intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, </span><span class="s2">false</span><span class="s1">)) {</span>
<span class="s1">TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview);</span>
<span class="s1">syncStatus.setText(intent</span>
<span class="s1">.getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG));</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">public boolean </span><span class="s1">onOptionsItemSelected(MenuItem item) {</span>
<span class="s2">switch </span><span class="s1">(item.getItemId()) {</span>
<span class="s2">case </span><span class="s1">android.R.id.home:</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(</span><span class="s2">this</span><span class="s1">, NotesListActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);</span>
<span class="s1">startActivity(intent);</span>
<span class="s2">return true</span><span class="s1">;</span>
<span class="s2">default</span><span class="s1">:</span>
<span class="s2">return false</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.ui</title></head><body><a href="DropdownMenu.java.html">DropdownMenu.java</a><br /><a href="NoteEditText.java.html">NoteEditText.java</a><br /><a href="NoteItemData.java.html">NoteItemData.java</a><br /><a href="AlarmReceiver.java.html">AlarmReceiver.java</a><br /><a href="NotesListItem.java.html">NotesListItem.java</a><br /><a href="DateTimePicker.java.html">DateTimePicker.java</a><br /><a href="NoteEditActivity.java.html">NoteEditActivity.java</a><br /><a href="NotesListAdapter.java.html">NotesListAdapter.java</a><br /><a href="AlarmInitReceiver.java.html">AlarmInitReceiver.java</a><br /><a href="NotesListActivity.java.html">NotesListActivity.java</a><br /><a href="AlarmAlertActivity.java.html">AlarmAlertActivity.java</a><br /><a href="FoldersListAdapter.java.html">FoldersListAdapter.java</a><br /><a href="DateTimePickerDialog.java.html">DateTimePickerDialog.java</a><br /><a href="NotesPreferenceActivity.java.html">NotesPreferenceActivity.java</a><br /></body></html>

@ -0,0 +1,153 @@
<html>
<head>
<title>NoteWidgetProvider.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
.s3 { color: #1750eb;}
.s4 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NoteWidgetProvider.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.widget;</span>
<span class="s2">import </span><span class="s1">android.app.PendingIntent;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetProvider;</span>
<span class="s2">import </span><span class="s1">android.content.ContentValues;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">android.content.Intent;</span>
<span class="s2">import </span><span class="s1">android.database.Cursor;</span>
<span class="s2">import </span><span class="s1">android.util.Log;</span>
<span class="s2">import </span><span class="s1">android.widget.RemoteViews;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes.NoteColumns;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NoteEditActivity;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.ui.NotesListActivity;</span>
<span class="s2">public abstract class </span><span class="s1">NoteWidgetProvider </span><span class="s2">extends </span><span class="s1">AppWidgetProvider {</span>
<span class="s2">public static final </span><span class="s1">String [] PROJECTION = </span><span class="s2">new </span><span class="s1">String [] {</span>
<span class="s1">NoteColumns.ID,</span>
<span class="s1">NoteColumns.BG_COLOR_ID,</span>
<span class="s1">NoteColumns.SNIPPET</span>
<span class="s1">};</span>
<span class="s2">public static final int </span><span class="s1">COLUMN_ID = </span><span class="s3">0</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">COLUMN_BG_COLOR_ID = </span><span class="s3">1</span><span class="s1">;</span>
<span class="s2">public static final int </span><span class="s1">COLUMN_SNIPPET = </span><span class="s3">2</span><span class="s1">;</span>
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s4">&quot;NoteWidgetProvider&quot;</span><span class="s1">;</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onDeleted(Context context, </span><span class="s2">int</span><span class="s1">[] appWidgetIds) {</span>
<span class="s1">ContentValues values = </span><span class="s2">new </span><span class="s1">ContentValues();</span>
<span class="s1">values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; appWidgetIds.length; i++) {</span>
<span class="s1">context.getContentResolver().update(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">values,</span>
<span class="s1">NoteColumns.WIDGET_ID + </span><span class="s4">&quot;=?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] { String.valueOf(appWidgetIds[i])});</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">private </span><span class="s1">Cursor getNoteWidgetInfo(Context context, </span><span class="s2">int </span><span class="s1">widgetId) {</span>
<span class="s2">return </span><span class="s1">context.getContentResolver().query(Notes.CONTENT_NOTE_URI,</span>
<span class="s1">PROJECTION,</span>
<span class="s1">NoteColumns.WIDGET_ID + </span><span class="s4">&quot;=? AND &quot; </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s4">&quot;&lt;&gt;?&quot;</span><span class="s1">,</span>
<span class="s2">new </span><span class="s1">String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) },</span>
<span class="s2">null</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">protected void </span><span class="s1">update(Context context, AppWidgetManager appWidgetManager, </span><span class="s2">int</span><span class="s1">[] appWidgetIds) {</span>
<span class="s1">update(context, appWidgetManager, appWidgetIds, </span><span class="s2">false</span><span class="s1">);</span>
<span class="s1">}</span>
<span class="s2">private void </span><span class="s1">update(Context context, AppWidgetManager appWidgetManager, </span><span class="s2">int</span><span class="s1">[] appWidgetIds,</span>
<span class="s2">boolean </span><span class="s1">privacyMode) {</span>
<span class="s2">for </span><span class="s1">(</span><span class="s2">int </span><span class="s1">i = </span><span class="s3">0</span><span class="s1">; i &lt; appWidgetIds.length; i++) {</span>
<span class="s2">if </span><span class="s1">(appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) {</span>
<span class="s2">int </span><span class="s1">bgId = ResourceParser.getDefaultBgId(context);</span>
<span class="s1">String snippet = </span><span class="s4">&quot;&quot;</span><span class="s1">;</span>
<span class="s1">Intent intent = </span><span class="s2">new </span><span class="s1">Intent(context, NoteEditActivity.</span><span class="s2">class</span><span class="s1">);</span>
<span class="s1">intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);</span>
<span class="s1">intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]);</span>
<span class="s1">intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType());</span>
<span class="s1">Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]);</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null </span><span class="s1">&amp;&amp; c.moveToFirst()) {</span>
<span class="s2">if </span><span class="s1">(c.getCount() &gt; </span><span class="s3">1</span><span class="s1">) {</span>
<span class="s1">Log.e(TAG, </span><span class="s4">&quot;Multiple message with same widget id:&quot; </span><span class="s1">+ appWidgetIds[i]);</span>
<span class="s1">c.close();</span>
<span class="s2">return</span><span class="s1">;</span>
<span class="s1">}</span>
<span class="s1">snippet = c.getString(COLUMN_SNIPPET);</span>
<span class="s1">bgId = c.getInt(COLUMN_BG_COLOR_ID);</span>
<span class="s1">intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID));</span>
<span class="s1">intent.setAction(Intent.ACTION_VIEW);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">snippet = context.getResources().getString(R.string.widget_havenot_content);</span>
<span class="s1">intent.setAction(Intent.ACTION_INSERT_OR_EDIT);</span>
<span class="s1">}</span>
<span class="s2">if </span><span class="s1">(c != </span><span class="s2">null</span><span class="s1">) {</span>
<span class="s1">c.close();</span>
<span class="s1">}</span>
<span class="s1">RemoteViews rv = </span><span class="s2">new </span><span class="s1">RemoteViews(context.getPackageName(), getLayoutId());</span>
<span class="s1">rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId));</span>
<span class="s1">intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId);</span>
<span class="s0">/**</span>
<span class="s0">* Generate the pending intent to start host for the widget</span>
<span class="s0">*/</span>
<span class="s1">PendingIntent pendingIntent = </span><span class="s2">null</span><span class="s1">;</span>
<span class="s2">if </span><span class="s1">(privacyMode) {</span>
<span class="s1">rv.setTextViewText(R.id.widget_text,</span>
<span class="s1">context.getString(R.string.widget_under_visit_mode));</span>
<span class="s1">pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], </span><span class="s2">new </span><span class="s1">Intent(</span>
<span class="s1">context, NotesListActivity.</span><span class="s2">class</span><span class="s1">), PendingIntent.FLAG_UPDATE_CURRENT);</span>
<span class="s1">} </span><span class="s2">else </span><span class="s1">{</span>
<span class="s1">rv.setTextViewText(R.id.widget_text, snippet);</span>
<span class="s1">pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent,</span>
<span class="s1">PendingIntent.FLAG_UPDATE_CURRENT);</span>
<span class="s1">}</span>
<span class="s1">rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent);</span>
<span class="s1">appWidgetManager.updateAppWidget(appWidgetIds[i], rv);</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s1">}</span>
<span class="s2">protected abstract int </span><span class="s1">getBgResourceId(</span><span class="s2">int </span><span class="s1">bgId);</span>
<span class="s2">protected abstract int </span><span class="s1">getLayoutId();</span>
<span class="s2">protected abstract int </span><span class="s1">getWidgetType();</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,66 @@
<html>
<head>
<title>NoteWidgetProvider_2x.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NoteWidgetProvider_2x.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.widget;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">public class </span><span class="s1">NoteWidgetProvider_2x </span><span class="s2">extends </span><span class="s1">NoteWidgetProvider {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onUpdate(Context context, AppWidgetManager appWidgetManager, </span><span class="s2">int</span><span class="s1">[] appWidgetIds) {</span>
<span class="s2">super</span><span class="s1">.update(context, appWidgetManager, appWidgetIds);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected int </span><span class="s1">getLayoutId() {</span>
<span class="s2">return </span><span class="s1">R.layout.widget_2x;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected int </span><span class="s1">getBgResourceId(</span><span class="s2">int </span><span class="s1">bgId) {</span>
<span class="s2">return </span><span class="s1">ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected int </span><span class="s1">getWidgetType() {</span>
<span class="s2">return </span><span class="s1">Notes.TYPE_WIDGET_2X;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1,65 @@
<html>
<head>
<title>NoteWidgetProvider_4x.java</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #8c8c8c; font-style: italic;}
.s1 { color: #080808;}
.s2 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
NoteWidgetProvider_4x.java</font>
</center></td></tr></table>
<pre><span class="s0">/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
* 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 &quot;AS IS&quot; 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.
*/</span>
<span class="s2">package </span><span class="s1">net.micode.notes.widget;</span>
<span class="s2">import </span><span class="s1">android.appwidget.AppWidgetManager;</span>
<span class="s2">import </span><span class="s1">android.content.Context;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.R;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.data.Notes;</span>
<span class="s2">import </span><span class="s1">net.micode.notes.tool.ResourceParser;</span>
<span class="s2">public class </span><span class="s1">NoteWidgetProvider_4x </span><span class="s2">extends </span><span class="s1">NoteWidgetProvider {</span>
<span class="s1">@Override</span>
<span class="s2">public void </span><span class="s1">onUpdate(Context context, AppWidgetManager appWidgetManager, </span><span class="s2">int</span><span class="s1">[] appWidgetIds) {</span>
<span class="s2">super</span><span class="s1">.update(context, appWidgetManager, appWidgetIds);</span>
<span class="s1">}</span>
<span class="s2">protected int </span><span class="s1">getLayoutId() {</span>
<span class="s2">return </span><span class="s1">R.layout.widget_4x;</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected int </span><span class="s1">getBgResourceId(</span><span class="s2">int </span><span class="s1">bgId) {</span>
<span class="s2">return </span><span class="s1">ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId);</span>
<span class="s1">}</span>
<span class="s1">@Override</span>
<span class="s2">protected int </span><span class="s1">getWidgetType() {</span>
<span class="s2">return </span><span class="s1">Notes.TYPE_WIDGET_4X;</span>
<span class="s1">}</span>
<span class="s1">}</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>net.micode.notes.widget</title></head><body><a href="NoteWidgetProvider.java.html">NoteWidgetProvider.java</a><br /><a href="NoteWidgetProvider_2x.java.html">NoteWidgetProvider_2x.java</a><br /><a href="NoteWidgetProvider_4x.java.html">NoteWidgetProvider_4x.java</a><br /></body></html>

@ -0,0 +1,177 @@
<html>
<head>
<title>AndroidManifest.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #0033b3;}
.s5 { color: #8c8c8c; font-style: italic;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
AndroidManifest.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s2">&lt;</span><span class="s4">manifest </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">xmlns:tools</span><span class="s3">=&quot;http://schemas.android.com/tools&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.POST_NOTIFICATIONS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;com.android.launcher.permission.INSTALL_SHORTCUT&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.INTERNET&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.READ_CONTACTS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.MANAGE_ACCOUNTS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.AUTHENTICATE_ACCOUNTS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.GET_ACCOUNTS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.USE_CREDENTIALS&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">=&quot;android.permission.RECEIVE_BOOT_COMPLETED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">application</span>
<span class="s1">android:allowBackup</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:dataExtractionRules</span><span class="s3">=&quot;@xml/data_extraction_rules&quot;</span>
<span class="s1">android:fullBackupContent</span><span class="s3">=&quot;@xml/backup_rules&quot;</span>
<span class="s1">android:icon</span><span class="s3">=&quot;@mipmap/ic_launcher&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/app_name&quot;</span>
<span class="s1">android:roundIcon</span><span class="s3">=&quot;@mipmap/ic_launcher_round&quot;</span>
<span class="s1">android:supportsRtl</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:theme</span><span class="s3">=&quot;@style/Theme.MyApplication&quot;</span>
<span class="s1">tools:targetApi</span><span class="s3">=&quot;31&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">activity</span>
<span class="s1">android:name</span><span class="s3">=&quot;.ui.NotesListActivity&quot;</span>
<span class="s1">android:configChanges</span><span class="s3">=&quot;keyboardHidden|orientation|screenSize&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/app_name&quot;</span>
<span class="s1">android:launchMode</span><span class="s3">=&quot;singleTop&quot;</span>
<span class="s1">android:theme</span><span class="s3">=&quot;@style/NoteTheme&quot;</span>
<span class="s1">android:uiOptions</span><span class="s3">=&quot;splitActionBarWhenNarrow&quot;</span>
<span class="s1">android:windowSoftInputMode</span><span class="s3">=&quot;adjustPan&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;true&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.MAIN&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.category.LAUNCHER&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s4">activity</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">activity</span>
<span class="s1">android:name</span><span class="s3">=&quot;.ui.NoteEditActivity&quot;</span>
<span class="s1">android:configChanges</span><span class="s3">=&quot;keyboardHidden|orientation|screenSize&quot;</span>
<span class="s1">android:launchMode</span><span class="s3">=&quot;singleTop&quot;</span>
<span class="s1">android:theme</span><span class="s3">=&quot;@style/NoteTheme&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;true&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.VIEW&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.category.DEFAULT&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">=&quot;vnd.android.cursor.item/text_note&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">=&quot;vnd.android.cursor.item/call_note&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.INSERT_OR_EDIT&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.category.DEFAULT&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">=&quot;vnd.android.cursor.item/text_note&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">=&quot;vnd.android.cursor.item/call_note&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.SEARCH&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.category.DEFAULT&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">meta-data</span>
<span class="s1">android:name</span><span class="s3">=&quot;android.app.searchable&quot;</span>
<span class="s1">android:resource</span><span class="s3">=&quot;@xml/searchable&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">activity</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">provider</span>
<span class="s1">android:name</span><span class="s3">=&quot;net.micode.notes.data.NotesProvider&quot;</span>
<span class="s1">android:authorities</span><span class="s3">=&quot;micode_notes&quot;</span>
<span class="s1">android:multiprocess</span><span class="s3">=&quot;true&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">receiver</span>
<span class="s1">android:name</span><span class="s3">=&quot;.widget.NoteWidgetProvider_2x&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/app_widget2x2&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;true&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.action.APPWIDGET_UPDATE&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.action.APPWIDGET_DELETED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.PRIVACY_MODE_CHANGED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">meta-data</span>
<span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.provider&quot;</span>
<span class="s1">android:resource</span><span class="s3">=&quot;@xml/widget_2x_info&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">receiver</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">receiver</span>
<span class="s1">android:name</span><span class="s3">=&quot;.widget.NoteWidgetProvider_4x&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/app_widget4x4&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;true&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.action.APPWIDGET_UPDATE&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.action.APPWIDGET_DELETED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.PRIVACY_MODE_CHANGED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">meta-data</span>
<span class="s1">android:name</span><span class="s3">=&quot;android.appwidget.provider&quot;</span>
<span class="s1">android:resource</span><span class="s3">=&quot;@xml/widget_4x_info&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">receiver</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">receiver</span>
<span class="s1">android:name</span><span class="s3">=&quot;.ui.AlarmInitReceiver&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;true&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">=&quot;android.intent.action.BOOT_COMPLETED&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">intent-filter</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s4">receiver</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">receiver</span>
<span class="s1">android:name</span><span class="s3">=&quot;net.micode.notes.ui.AlarmReceiver&quot;</span>
<span class="s1">android:process</span><span class="s3">=&quot;:remote&quot;</span><span class="s2">&gt;&lt;/</span><span class="s4">receiver</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">activity</span>
<span class="s1">android:name</span><span class="s3">=&quot;.ui.AlarmAlertActivity&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/app_name&quot;</span>
<span class="s1">android:launchMode</span><span class="s3">=&quot;singleInstance&quot;</span>
<span class="s1">android:theme</span><span class="s3">=&quot;@android:style/Theme.Holo.Wallpaper.NoTitleBar&quot;</span><span class="s2">&gt;&lt;/</span><span class="s4">activity</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">activity</span>
<span class="s1">android:name</span><span class="s3">=&quot;net.micode.notes.ui.NotesPreferenceActivity&quot;</span>
<span class="s1">android:label</span><span class="s3">=&quot;@string/preferences_title&quot;</span>
<span class="s1">android:launchMode</span><span class="s3">=&quot;singleTop&quot;</span>
<span class="s1">android:theme</span><span class="s3">=&quot;@android:style/Theme.Holo.Light&quot;</span><span class="s2">&gt;&lt;/</span><span class="s4">activity</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">service</span>
<span class="s1">android:name</span><span class="s3">=&quot;net.micode.notes.gtask.remote.GTaskSyncService&quot;</span>
<span class="s1">android:exported</span><span class="s3">=&quot;false&quot;</span><span class="s2">&gt;&lt;/</span><span class="s4">service</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">meta-data</span>
<span class="s1">android:name</span><span class="s3">=&quot;android.app.default_searchable&quot;</span>
<span class="s1">android:value</span><span class="s3">=&quot;.ui.NoteEditActivity&quot; </span><span class="s2">/&gt;</span>
<span class="s5">&lt;!-- &lt;activity--&gt;</span>
<span class="s5">&lt;!-- android:name=&quot;.MainActivity&quot;--&gt;</span>
<span class="s5">&lt;!-- android:exported=&quot;true&quot;&gt;--&gt;</span>
<span class="s5">&lt;!-- &lt;intent-filter&gt;--&gt;</span>
<span class="s5">&lt;!-- &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt;--&gt;</span>
<span class="s5">&lt;!-- &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt;--&gt;</span>
<span class="s5">&lt;!-- &lt;/intent-filter&gt;--&gt;</span>
<span class="s5">&lt;!-- &lt;/activity&gt;--&gt;</span>
<span class="s2">&lt;/</span><span class="s4">application</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s4">manifest</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>color</title></head><body><a href="primary_text_dark.xml.html">primary_text_dark.xml</a><br /><a href="secondary_text_dark.xml.html">secondary_text_dark.xml</a><br /></body></html>

@ -0,0 +1,43 @@
<html>
<head>
<title>primary_text_dark.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
primary_text_dark.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;UTF-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:state_pressed</span><span class="s3">=&quot;true&quot; </span><span class="s1">android:color</span><span class="s3">=&quot;#88555555&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:state_selected</span><span class="s3">=&quot;true&quot; </span><span class="s1">android:color</span><span class="s3">=&quot;#ff999999&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:color</span><span class="s3">=&quot;#ff000000&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">selector</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,41 @@
<html>
<head>
<title>secondary_text_dark.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
secondary_text_dark.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;UTF-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:color</span><span class="s3">=&quot;#50000000&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">selector</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>drawable-hdpi</title></head><body></body></html>

@ -0,0 +1,191 @@
<html>
<head>
<title>ic_launcher_background.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ic_launcher_background.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s2">&lt;</span><span class="s4">vector </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:width</span><span class="s3">=&quot;108dp&quot;</span>
<span class="s1">android:height</span><span class="s3">=&quot;108dp&quot;</span>
<span class="s1">android:viewportWidth</span><span class="s3">=&quot;108&quot;</span>
<span class="s1">android:viewportHeight</span><span class="s3">=&quot;108&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#3DDC84&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,0h108v108h-108z&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M9,0L9,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,0L19,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M29,0L29,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M39,0L39,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M49,0L49,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M59,0L59,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M69,0L69,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M79,0L79,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M89,0L89,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M99,0L99,108&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,9L108,9&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,19L108,19&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,29L108,29&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,39L108,39&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,49L108,49&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,59L108,59&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,69L108,69&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,79L108,79&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,89L108,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M0,99L108,99&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,29L89,29&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,39L89,39&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,49L89,49&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,59L89,59&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,69L89,69&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M19,79L89,79&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M29,19L29,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M39,19L39,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M49,19L49,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M59,19L59,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M69,19L69,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">path</span>
<span class="s1">android:fillColor</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s1">android:pathData</span><span class="s3">=&quot;M79,19L79,89&quot;</span>
<span class="s1">android:strokeWidth</span><span class="s3">=&quot;0.8&quot;</span>
<span class="s1">android:strokeColor</span><span class="s3">=&quot;#33FFFFFF&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">vector</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,49 @@
<html>
<head>
<title>ic_launcher_foreground.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808;}
.s1 { color: #0033b3;}
.s2 { color: #174ad4;}
.s3 { color: #067d17;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ic_launcher_foreground.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;</span><span class="s1">vector </span><span class="s2">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s2">xmlns:aapt</span><span class="s3">=&quot;http://schemas.android.com/aapt&quot;</span>
<span class="s2">android:width</span><span class="s3">=&quot;108dp&quot;</span>
<span class="s2">android:height</span><span class="s3">=&quot;108dp&quot;</span>
<span class="s2">android:viewportWidth</span><span class="s3">=&quot;108&quot;</span>
<span class="s2">android:viewportHeight</span><span class="s3">=&quot;108&quot;</span><span class="s0">&gt;</span>
<span class="s0">&lt;</span><span class="s1">path </span><span class="s2">android:pathData</span><span class="s3">=&quot;M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z&quot;</span><span class="s0">&gt;</span>
<span class="s0">&lt;</span><span class="s1">aapt:attr </span><span class="s2">name</span><span class="s3">=&quot;android:fillColor&quot;</span><span class="s0">&gt;</span>
<span class="s0">&lt;</span><span class="s1">gradient</span>
<span class="s2">android:endX</span><span class="s3">=&quot;85.84757&quot;</span>
<span class="s2">android:endY</span><span class="s3">=&quot;92.4963&quot;</span>
<span class="s2">android:startX</span><span class="s3">=&quot;42.9492&quot;</span>
<span class="s2">android:startY</span><span class="s3">=&quot;49.59793&quot;</span>
<span class="s2">android:type</span><span class="s3">=&quot;linear&quot;</span><span class="s0">&gt;</span>
<span class="s0">&lt;</span><span class="s1">item</span>
<span class="s2">android:color</span><span class="s3">=&quot;#44000000&quot;</span>
<span class="s2">android:offset</span><span class="s3">=&quot;0.0&quot; </span><span class="s0">/&gt;</span>
<span class="s0">&lt;</span><span class="s1">item</span>
<span class="s2">android:color</span><span class="s3">=&quot;#00000000&quot;</span>
<span class="s2">android:offset</span><span class="s3">=&quot;1.0&quot; </span><span class="s0">/&gt;</span>
<span class="s0">&lt;/</span><span class="s1">gradient</span><span class="s0">&gt;</span>
<span class="s0">&lt;/</span><span class="s1">aapt:attr</span><span class="s0">&gt;</span>
<span class="s0">&lt;/</span><span class="s1">path</span><span class="s0">&gt;</span>
<span class="s0">&lt;</span><span class="s1">path</span>
<span class="s2">android:fillColor</span><span class="s3">=&quot;#FFFFFF&quot;</span>
<span class="s2">android:fillType</span><span class="s3">=&quot;nonZero&quot;</span>
<span class="s2">android:pathData</span><span class="s3">=&quot;M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z&quot;</span>
<span class="s2">android:strokeWidth</span><span class="s3">=&quot;1&quot;</span>
<span class="s2">android:strokeColor</span><span class="s3">=&quot;#00000000&quot; </span><span class="s0">/&gt;</span>
<span class="s0">&lt;/</span><span class="s1">vector</span><span class="s0">&gt;</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>drawable</title></head><body><a href="new_note.xml.html">new_note.xml</a><br /><a href="ic_launcher_background.xml.html">ic_launcher_background.xml</a><br /><a href="ic_launcher_foreground.xml.html">ic_launcher_foreground.xml</a><br /></body></html>

@ -0,0 +1,45 @@
<html>
<head>
<title>new_note.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
new_note.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:state_pressed</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/new_note_pressed&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/new_note_normal&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">selector</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,64 @@
<html>
<head>
<title>account_dialog_title.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
account_dialog_title.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/account_dialog_title&quot;</span>
<span class="s1">style</span><span class="s3">=&quot;?android:attr/textAppearanceMedium&quot;</span>
<span class="s1">android:singleLine</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:ellipsize</span><span class="s3">=&quot;end&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:layout_marginTop</span><span class="s3">=&quot;-2.7dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;-2.7dip&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/account_dialog_subtitle&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginTop</span><span class="s3">=&quot;5dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;1dip&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,39 @@
<html>
<head>
<title>activity_main.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
activity_main.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s2">&lt;</span><span class="s4">androidx.constraintlayout.widget.ConstraintLayout </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">xmlns:app</span><span class="s3">=&quot;http://schemas.android.com/apk/res-auto&quot;</span>
<span class="s1">xmlns:tools</span><span class="s3">=&quot;http://schemas.android.com/tools&quot;</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/main&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">tools:context</span><span class="s3">=&quot;.MainActivity&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;Hello World!&quot;</span>
<span class="s1">app:layout_constraintBottom_toBottomOf</span><span class="s3">=&quot;parent&quot;</span>
<span class="s1">app:layout_constraintEnd_toEndOf</span><span class="s3">=&quot;parent&quot;</span>
<span class="s1">app:layout_constraintStart_toStartOf</span><span class="s3">=&quot;parent&quot;</span>
<span class="s1">app:layout_constraintTop_toTopOf</span><span class="s3">=&quot;parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">androidx.constraintlayout.widget.ConstraintLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,53 @@
<html>
<head>
<title>add_account_text.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
add_account_text.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:minHeight</span><span class="s3">=&quot;50dip&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;?android:attr/textAppearanceMedium&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/preferences_add_account&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,77 @@
<html>
<head>
<title>datetime_picker.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
datetime_picker.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;horizontal&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_horizontal&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">NumberPicker</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/date&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;120dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:focusableInTouchMode</span><span class="s3">=&quot;true&quot;</span>
<span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">NumberPicker</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/hour&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;50dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;5dip&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:focusableInTouchMode</span><span class="s3">=&quot;true&quot;</span>
<span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">NumberPicker</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/minute&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;50dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;5dip&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:focusableInTouchMode</span><span class="s3">=&quot;true&quot;</span>
<span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">NumberPicker</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/amPm&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;50dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;5dip&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:focusableInTouchMode</span><span class="s3">=&quot;true&quot;</span>
<span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,44 @@
<html>
<head>
<title>dialog_edit_text.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
dialog_edit_text.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">EditText</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/et_foler_name&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:hint</span><span class="s3">=&quot;@string/hint_foler_name&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot; </span><span class="s2">/&gt;</span></pre>
</body>
</html>

@ -0,0 +1,50 @@
<html>
<head>
<title>folder_list_item.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
folder_list_item.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:minHeight</span><span class="s3">=&quot;50dip&quot; </span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_folder_name&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearancePrimaryItem&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>layout</title></head><body><a href="note_edit.xml.html">note_edit.xml</a><br /><a href="note_item.xml.html">note_item.xml</a><br /><a href="note_list.xml.html">note_list.xml</a><br /><a href="widget_2x.xml.html">widget_2x.xml</a><br /><a href="widget_4x.xml.html">widget_4x.xml</a><br /><a href="activity_main.xml.html">activity_main.xml</a><br /><a href="datetime_picker.xml.html">datetime_picker.xml</a><br /><a href="settings_header.xml.html">settings_header.xml</a><br /><a href="add_account_text.xml.html">add_account_text.xml</a><br /><a href="dialog_edit_text.xml.html">dialog_edit_text.xml</a><br /><a href="folder_list_item.xml.html">folder_list_item.xml</a><br /><a href="note_list_footer.xml.html">note_list_footer.xml</a><br /><a href="note_edit_list_item.xml.html">note_edit_list_item.xml</a><br /><a href="account_dialog_title.xml.html">account_dialog_title.xml</a><br /><a href="note_list_dropdown_menu.xml.html">note_list_dropdown_menu.xml</a><br /></body></html>

@ -0,0 +1,431 @@
<html>
<head>
<title>note_edit.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_edit.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/list_background&quot;</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/note_title&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_modified_date&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;left|center_vertical&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;8dip&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceSecondaryItem&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_alert_icon&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/title_alert&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_alert_date&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;2dip&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;8dip&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceSecondaryItem&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageButton</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/bg_btn_set_color&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/sv_note_edit&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;7dip&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/bg_color_btn_mask&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ScrollView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;left|top&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:fadingEdgeLength</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:overScrollMode</span><span class="s3">=&quot;never&quot;</span>
<span class="s1">android:scrollbars</span><span class="s3">=&quot;none&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">net.micode.notes.ui.NoteEditText</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/note_edit_view&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:autoLink</span><span class="s3">=&quot;all&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@null&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;left|top&quot;</span>
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">=&quot;1.2&quot;</span>
<span class="s1">android:linksClickable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:minLines</span><span class="s3">=&quot;12&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearancePrimaryItem&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/note_edit_list&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;-10dip&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">ScrollView</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;7dip&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/bg_color_btn_mask&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageButton</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/add_img_btn&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;7dp&quot;</span>
<span class="s1">android:layout_marginTop</span><span class="s3">=&quot;600dp&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;7dp&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@android:drawable/ic_menu_gallery&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/btn_set_bg_color&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;43dip&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/bg_color_btn_mask&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;top|right&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/note_bg_color_selector&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/note_edit_color_selector_panel&quot;</span>
<span class="s1">android:layout_marginTop</span><span class="s3">=&quot;30dip&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;8dip&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;top|right&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_yellow&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_yellow_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;5dip&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_blue&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_blue_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;3dip&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_white&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_white_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;2dip&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_green&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_green_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_red&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_bg_red_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/font_size_selector&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/font_size_selector_bg&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/ll_font_small&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/font_small&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;5dip&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/menu_font_small&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceUnderMenuIcon&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_small_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;6dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;-7dip&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/ll_font_normal&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/font_normal&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;5dip&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/menu_font_normal&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceUnderMenuIcon&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_medium_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;6dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;-7dip&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/ll_font_large&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/font_large&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;5dip&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/menu_font_large&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceUnderMenuIcon&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_large_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;6dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;-7dip&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/ll_font_super&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/font_super&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;5dip&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/menu_font_super&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceUnderMenuIcon&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_super_select&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom|right&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;6dip&quot;</span>
<span class="s1">android:layout_marginBottom</span><span class="s3">=&quot;-7dip&quot;</span>
<span class="s1">android:src</span><span class="s3">=&quot;@drawable/selected&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,61 @@
<html>
<head>
<title>note_edit_list_item.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_edit_list_item.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">CheckBox</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/cb_edit_item&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;28dip&quot;</span>
<span class="s1">android:checked</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;top|left&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">net.micode.notes.ui.NoteEditText</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/et_edit_text&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">=&quot;1.2&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearancePrimaryItem&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@null&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,100 @@
<html>
<head>
<title>note_item.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_item.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/note_item&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center_vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_name&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearancePrimaryItem&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center_vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_title&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:singleLine</span><span class="s3">=&quot;true&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_time&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:textAppearance</span><span class="s3">=&quot;@style/TextAppearanceSecondaryItem&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">CheckBox</span>
<span class="s1">android:id</span><span class="s3">=&quot;@android:id/checkbox&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:clickable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/iv_alert_icon&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;top|right&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,86 @@
<html>
<head>
<title>note_list.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">xmlns:tools</span><span class="s3">=&quot;http://schemas.android.com/tools&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span><span class="s2">&gt;</span>
<span class="s4">&lt;!-- android:background=&quot;@drawable/list_background&quot;&gt;--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/tv_title_bar&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/title_bar_bg&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;center_vertical&quot;</span>
<span class="s1">android:singleLine</span><span class="s3">=&quot;true&quot;</span>
<span class="s1">android:textColor</span><span class="s3">=&quot;#FFEAD1AE&quot;</span>
<span class="s1">android:textSize</span><span class="s3">=&quot;@dimen/text_font_size_medium&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">ListView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/notes_list&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;0dip&quot;</span>
<span class="s1">android:layout_weight</span><span class="s3">=&quot;1&quot;</span>
<span class="s1">android:cacheColorHint</span><span class="s3">=&quot;@null&quot;</span>
<span class="s1">android:divider</span><span class="s3">=&quot;@null&quot;</span>
<span class="s1">android:fadingEdge</span><span class="s3">=&quot;@null&quot;</span>
<span class="s1">android:listSelector</span><span class="s3">=&quot;@android:color/transparent&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;visible&quot;</span>
<span class="s1">tools:visibility</span><span class="s3">=&quot;visible&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">Button</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/btn_new_note&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;490dp&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">='183dp'</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;bottom&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/new_note&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;visible&quot;</span>
<span class="s1">tools:visibility</span><span class="s3">=&quot;visible&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
<span class="s4">&lt;!-- android:layout_width=&quot;match_parent&quot;--&gt;</span>
<span class="s4">&lt;!-- android:layout_height=&quot;wrap_content&quot;--&gt;</span></pre>
</body>
</html>

@ -0,0 +1,54 @@
<html>
<head>
<title>note_list_dropdown_menu.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list_dropdown_menu.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/navigation_bar&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;horizontal&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">Button</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/selection_menu&quot;</span>
<span class="s1">style</span><span class="s3">=&quot;?android:attr/borderlessButtonStyle&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;match_parent&quot;</span>
<span class="s1">android:divider</span><span class="s3">=&quot;?android:attr/listDividerAlertDialog&quot;</span>
<span class="s1">android:gravity</span><span class="s3">=&quot;left|center_vertical&quot;</span>
<span class="s1">android:singleLine</span><span class="s3">=&quot;true&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,45 @@
<html>
<head>
<title>note_list_footer.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list_footer.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">View</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;100dip&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;invisible&quot;</span>
<span class="s1">android:focusable</span><span class="s3">=&quot;false&quot;</span>
<span class="s1">android:background</span><span class="s3">=&quot;@drawable/list_footer_bg&quot; </span><span class="s2">/&gt;</span></pre>
</body>
</html>

@ -0,0 +1,62 @@
<html>
<head>
<title>settings_header.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
settings_header.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">LinearLayout</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:orientation</span><span class="s3">=&quot;vertical&quot;</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">Button</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/preference_sync_button&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_marginTop</span><span class="s3">=&quot;15dip&quot;</span>
<span class="s1">android:layout_marginLeft</span><span class="s3">=&quot;30dip&quot;</span>
<span class="s1">android:layout_marginRight</span><span class="s3">=&quot;30dip&quot;</span>
<span class="s1">style</span><span class="s3">=&quot;?android:attr/textAppearanceMedium&quot;</span>
<span class="s1">android:text</span><span class="s3">=&quot;@string/preferences_button_sync_immediately&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/prefenerece_sync_status_textview&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;wrap_content&quot;</span>
<span class="s1">android:layout_gravity</span><span class="s3">=&quot;center&quot;</span>
<span class="s1">android:visibility</span><span class="s3">=&quot;gone&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">LinearLayout</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,59 @@
<html>
<head>
<title>widget_2x.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
widget_2x.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;146dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;146dip&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/widget_bg_image&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/widget_text&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:paddingTop</span><span class="s3">=&quot;20dip&quot;</span>
<span class="s1">android:paddingLeft</span><span class="s3">=&quot;15dip&quot;</span>
<span class="s1">android:paddingRight</span><span class="s3">=&quot;15dip&quot;</span>
<span class="s1">android:textSize</span><span class="s3">=&quot;14sp&quot;</span>
<span class="s1">android:textColor</span><span class="s3">=&quot;#FF663300&quot;</span>
<span class="s1">android:maxLines</span><span class="s3">=&quot;6&quot;</span>
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">=&quot;1.2&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,61 @@
<html>
<head>
<title>widget_4x.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
widget_4x.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">FrameLayout</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;294dip&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;294dip&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">ImageView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/widget_bg_image&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">TextView</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/widget_text&quot;</span>
<span class="s1">android:layout_width</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:layout_height</span><span class="s3">=&quot;fill_parent&quot;</span>
<span class="s1">android:paddingTop</span><span class="s3">=&quot;40dip&quot;</span>
<span class="s1">android:paddingLeft</span><span class="s3">=&quot;15dip&quot;</span>
<span class="s1">android:paddingRight</span><span class="s3">=&quot;15dip&quot;</span>
<span class="s1">android:textSize</span><span class="s3">=&quot;14sp&quot;</span>
<span class="s1">android:textColor</span><span class="s3">=&quot;#FF663300&quot;</span>
<span class="s1">android:maxLines</span><span class="s3">=&quot;12&quot;</span>
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">=&quot;1.2&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">FrameLayout</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,70 @@
<html>
<head>
<title>call_note_edit.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
call_note_edit.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_delete&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_delete&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_font_size&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_font_size&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_list_mode&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_list_mode&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_share&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_share&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_send_to_desktop&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_send_to_desktop&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_alert&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_alert&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_delete_remind&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_remove_remind&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,45 @@
<html>
<head>
<title>call_record_folder.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
call_record_folder.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_search&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_search&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>menu</title></head><body><a href="note_edit.xml.html">note_edit.xml</a><br /><a href="note_list.xml.html">note_list.xml</a><br /><a href="sub_folder.xml.html">sub_folder.xml</a><br /><a href="call_note_edit.xml.html">call_note_edit.xml</a><br /><a href="note_list_options.xml.html">note_list_options.xml</a><br /><a href="call_record_folder.xml.html">call_record_folder.xml</a><br /><a href="note_list_dropdown.xml.html">note_list_dropdown.xml</a><br /></body></html>

@ -0,0 +1,73 @@
<html>
<head>
<title>note_edit.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_edit.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_new_note&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/notelist_menu_new&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_delete&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_delete&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_font_size&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_font_size&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_list_mode&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_list_mode&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_share&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_share&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_send_to_desktop&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_send_to_desktop&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_alert&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_alert&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_delete_remind&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_remove_remind&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,74 @@
<html>
<head>
<title>note_list.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_new_folder&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_create_folder&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_export_text&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_export_text&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_sync&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_sync&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_setting&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_setting&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_search&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_search&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_moon&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_moon&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_green&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_green&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_ship&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_ship&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span>
</pre>
</body>
</html>

@ -0,0 +1,41 @@
<html>
<head>
<title>note_list_dropdown.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list_dropdown.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item </span><span class="s1">android:id</span><span class="s3">=&quot;@+id/action_select_all&quot; </span><span class="s1">android:title</span><span class="s3">=&quot;@string/menu_select_all&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,52 @@
<html>
<head>
<title>note_list_options.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
note_list_options.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/move&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_move&quot;</span>
<span class="s1">android:icon</span><span class="s3">=&quot;@drawable/menu_move&quot;</span>
<span class="s1">android:showAsAction</span><span class="s3">=&quot;always|withText&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/delete&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/menu_delete&quot;</span>
<span class="s1">android:icon</span><span class="s3">=&quot;@drawable/menu_delete&quot;</span>
<span class="s1">android:showAsAction</span><span class="s3">=&quot;always|withText&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,45 @@
<html>
<head>
<title>sub_folder.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #8c8c8c; font-style: italic;}
.s5 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
sub_folder.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s4">&lt;!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
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 &quot;AS IS&quot; 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.
--&gt;</span>
<span class="s2">&lt;</span><span class="s5">menu</span>
<span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s5">item</span>
<span class="s1">android:id</span><span class="s3">=&quot;@+id/menu_new_note&quot;</span>
<span class="s1">android:title</span><span class="s3">=&quot;@string/notelist_menu_new&quot;</span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s5">menu</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,26 @@
<html>
<head>
<title>ic_launcher.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ic_launcher.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s2">&lt;</span><span class="s4">adaptive-icon </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">background </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_background&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">foreground </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_foreground&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">monochrome </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_foreground&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">adaptive-icon</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1,26 @@
<html>
<head>
<title>ic_launcher_round.xml</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808; font-style: italic;}
.s1 { color: #174ad4;}
.s2 { color: #080808;}
.s3 { color: #067d17;}
.s4 { color: #0033b3;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
ic_launcher_round.xml</font>
</center></td></tr></table>
<pre><span class="s0">&lt;?</span><span class="s1">xml version</span><span class="s3">=&quot;1.0&quot; </span><span class="s1">encoding</span><span class="s3">=&quot;utf-8&quot;</span><span class="s0">?&gt;</span>
<span class="s2">&lt;</span><span class="s4">adaptive-icon </span><span class="s1">xmlns:android</span><span class="s3">=&quot;http://schemas.android.com/apk/res/android&quot;</span><span class="s2">&gt;</span>
<span class="s2">&lt;</span><span class="s4">background </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_background&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">foreground </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_foreground&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;</span><span class="s4">monochrome </span><span class="s1">android:drawable</span><span class="s3">=&quot;@drawable/ic_launcher_foreground&quot; </span><span class="s2">/&gt;</span>
<span class="s2">&lt;/</span><span class="s4">adaptive-icon</span><span class="s2">&gt;</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>mipmap-anydpi</title></head><body><a href="ic_launcher.xml.html">ic_launcher.xml</a><br /><a href="ic_launcher_round.xml.html">ic_launcher_round.xml</a><br /></body></html>

@ -0,0 +1 @@
<html><head><title>mipmap-hdpi</title></head><body></body></html>

@ -0,0 +1 @@
<html><head><title>mipmap-mdpi</title></head><body></body></html>

@ -0,0 +1 @@
<html><head><title>mipmap-xhdpi</title></head><body></body></html>

@ -0,0 +1 @@
<html><head><title>mipmap-xxhdpi</title></head><body></body></html>

@ -0,0 +1 @@
<html><head><title>mipmap-xxxhdpi</title></head><body></body></html>

@ -0,0 +1 @@
<html><head><title>raw-zh-rCN</title></head><body><a href="introduction.html">introduction</a><br /></body></html>

@ -0,0 +1,24 @@
<html>
<head>
<title>introduction</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
introduction</font>
</center></td></tr></table>
<pre><span class="s0">欢迎使用MIUI便签</span>
<span class="s0">无论从软件中直接添加还是从桌面拖出widgetMIUI便签能让你快速建立和保存便签</span>
<span class="s0">除了调整文字大小、便签背景、文件夹等基础功能外你会发现MIUI便签也提供了清单模式、便签提醒、软件加密、导出到SD卡、同步google task的高级功能让你的生活记录更加美好和安全</span>
<span class="s0">来分享你的使用体验吧http://www.miui.com/index.php</span>
</pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>raw</title></head><body><a href="introduction.html">introduction</a><br /></body></html>

@ -0,0 +1,17 @@
<html>
<head>
<title>introduction</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #080808;}
</style>
</head>
<body bgcolor="#ffffff">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#c0c0c0" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
introduction</font>
</center></td></tr></table>
<pre><span class="s0">Welcome to use MIUI notes!</span></pre>
</body>
</html>

@ -0,0 +1 @@
<html><head><title>values-night</title></head><body><a href="themes.xml.html">themes.xml</a><br /></body></html>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save