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"><a href="http://d.android.com/tools/testing"></span><span class="s2">Testing documentation</span><span class="s4"></a></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">"net.micode.notes"</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"><a href="http://d.android.com/tools/testing"></span><span class="s2">Testing documentation</span><span class="s4"></a></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) -> {</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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<String, String> sContactCache;</span>
|
||||
<span class="s2">private static final </span><span class="s1">String TAG = </span><span class="s3">"Contact"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String CALLER_ID_SELECTION = </span><span class="s3">"PHONE_NUMBERS_EQUAL(" </span><span class="s1">+ Phone.NUMBER</span>
|
||||
<span class="s1">+ </span><span class="s3">",?) AND " </span><span class="s1">+ Data.MIMETYPE + </span><span class="s3">"='" </span><span class="s1">+ Phone.CONTENT_ITEM_TYPE + </span><span class="s3">"'"</span>
|
||||
<span class="s1">+ </span><span class="s3">" AND " </span><span class="s1">+ Data.RAW_CONTACT_ID + </span><span class="s3">" IN "</span>
|
||||
<span class="s1">+ </span><span class="s3">"(SELECT raw_contact_id "</span>
|
||||
<span class="s1">+ </span><span class="s3">" FROM phone_lookup"</span>
|
||||
<span class="s1">+ </span><span class="s3">" WHERE min_match = '+')"</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<String, String>();</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">"+"</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">&& 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">" Cursor get string error " </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">"No contact matched with number:" </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"micode_notes"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String TAG = </span><span class="s3">"Notes"</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">"net.micode.notes.alert_date"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_BACKGROUND_ID = </span><span class="s3">"net.micode.notes.background_color_id"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_WIDGET_ID = </span><span class="s3">"net.micode.notes.widget_id"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_WIDGET_TYPE = </span><span class="s3">"net.micode.notes.widget_type"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_FOLDER_ID = </span><span class="s3">"net.micode.notes.folder_id"</span><span class="s1">;</span>
|
||||
<span class="s2">public static final </span><span class="s1">String INTENT_EXTRA_CALL_DATE = </span><span class="s3">"net.micode.notes.call_date"</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">"content://" </span><span class="s1">+ AUTHORITY + </span><span class="s3">"/note"</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">"content://" </span><span class="s1">+ AUTHORITY + </span><span class="s3">"/data"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String ID = </span><span class="s3">"_id"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String PARENT_ID = </span><span class="s3">"parent_id"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String CREATED_DATE = </span><span class="s3">"created_date"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Latest modified date</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String MODIFIED_DATE = </span><span class="s3">"modified_date"</span><span class="s1">;</span>
|
||||
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Alert date</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String ALERTED_DATE = </span><span class="s3">"alert_date"</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"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String SNIPPET = </span><span class="s3">"snippet"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Note's widget id</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String WIDGET_ID = </span><span class="s3">"widget_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Note's widget type</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String WIDGET_TYPE = </span><span class="s3">"widget_type"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String BG_COLOR_ID = </span><span class="s3">"bg_color_id"</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"><P> </span><span class="s0">Type: INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String HAS_ATTACHMENT = </span><span class="s3">"has_attachment"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String NOTES_COUNT = </span><span class="s3">"notes_count"</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"><P> </span><span class="s0">Type: INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String TYPE = </span><span class="s3">"type"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* The last sync id</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String SYNC_ID = </span><span class="s3">"sync_id"</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"><P> </span><span class="s0">Type: INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String LOCAL_MODIFIED = </span><span class="s3">"local_modified"</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"><P> </span><span class="s0">Type : INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String ORIGIN_PARENT_ID = </span><span class="s3">"origin_parent_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* The gtask id</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type : TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String GTASK_ID = </span><span class="s3">"gtask_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* The version code</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type : INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String VERSION = </span><span class="s3">"version"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String ID = </span><span class="s3">"_id"</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"><P> </span><span class="s0">Type: Text </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String MIME_TYPE = </span><span class="s3">"mime_type"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String NOTE_ID = </span><span class="s3">"note_id"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String CREATED_DATE = </span><span class="s3">"created_date"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Latest modified date</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String MODIFIED_DATE = </span><span class="s3">"modified_date"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s0">/**</span>
|
||||
<span class="s0">* Data's content</span>
|
||||
<span class="s0">* </span><span class="s6"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String CONTENT = </span><span class="s3">"content"</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"><P> </span><span class="s0">Type: INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String DATA1 = </span><span class="s3">"data1"</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"><P> </span><span class="s0">Type: INTEGER </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String DATA2 = </span><span class="s3">"data2"</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"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String DATA3 = </span><span class="s3">"data3"</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"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String DATA4 = </span><span class="s3">"data4"</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"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></span>
|
||||
<span class="s0">*/</span>
|
||||
<span class="s2">public static final </span><span class="s1">String DATA5 = </span><span class="s3">"data5"</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"><P> </span><span class="s0">Type: Integer 1:check list mode 0: normal mode </span><span class="s6"></P></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">"vnd.android.cursor.dir/text_note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">String CONTENT_ITEM_TYPE = </span><span class="s3">"vnd.android.cursor.item/text_note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">Uri CONTENT_URI = Uri.parse(</span><span class="s3">"content://" </span><span class="s1">+ AUTHORITY + </span><span class="s3">"/text_note"</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"><P> </span><span class="s0">Type: INTEGER (long) </span><span class="s6"></P></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"><P> </span><span class="s0">Type: TEXT </span><span class="s6"></P></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">"vnd.android.cursor.dir/call_note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">String CONTENT_ITEM_TYPE = </span><span class="s3">"vnd.android.cursor.item/call_note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">Uri CONTENT_URI = Uri.parse(</span><span class="s3">"content://" </span><span class="s1">+ AUTHORITY + </span><span class="s3">"/call_note"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"note.db"</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">"note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">String DATA = </span><span class="s3">"data"</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">"NotesDatabaseHelper"</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">"CREATE TABLE " </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">"(" </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.ID + </span><span class="s3">" INTEGER PRIMARY KEY," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.PARENT_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.ALERTED_DATE + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.BG_COLOR_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">" INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.HAS_ATTACHMENT + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">" INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.NOTES_COUNT + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.SNIPPET + </span><span class="s3">" TEXT NOT NULL DEFAULT ''," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.TYPE + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.WIDGET_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.WIDGET_TYPE + </span><span class="s3">" INTEGER NOT NULL DEFAULT -1," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.SYNC_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.LOCAL_MODIFIED + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.ORIGIN_PARENT_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.GTASK_ID + </span><span class="s3">" TEXT NOT NULL DEFAULT ''," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.VERSION + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0" </span><span class="s1">+</span>
|
||||
<span class="s3">")"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String CREATE_DATA_TABLE_SQL =</span>
|
||||
<span class="s3">"CREATE TABLE " </span><span class="s1">+ TABLE.DATA + </span><span class="s3">"(" </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.ID + </span><span class="s3">" INTEGER PRIMARY KEY," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.MIME_TYPE + </span><span class="s3">" TEXT NOT NULL," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.NOTE_ID + </span><span class="s3">" INTEGER NOT NULL DEFAULT 0," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.CREATED_DATE + </span><span class="s3">" INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," </span><span class="s1">+</span>
|
||||
<span class="s1">NoteColumns.MODIFIED_DATE + </span><span class="s3">" INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.CONTENT + </span><span class="s3">" TEXT NOT NULL DEFAULT ''," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.DATA1 + </span><span class="s3">" INTEGER," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.DATA2 + </span><span class="s3">" INTEGER," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.DATA3 + </span><span class="s3">" TEXT NOT NULL DEFAULT ''," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.DATA4 + </span><span class="s3">" TEXT NOT NULL DEFAULT ''," </span><span class="s1">+</span>
|
||||
<span class="s1">DataColumns.DATA5 + </span><span class="s3">" TEXT NOT NULL DEFAULT ''" </span><span class="s1">+</span>
|
||||
<span class="s3">")"</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">"CREATE INDEX IF NOT EXISTS note_id_index ON " </span><span class="s1">+</span>
|
||||
<span class="s1">TABLE.DATA + </span><span class="s3">"(" </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">");"</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">"CREATE TRIGGER increase_folder_count_on_update "</span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER UPDATE OF " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">" ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN " </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"=" </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">" + 1" </span><span class="s1">+</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=new." </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER decrease_folder_count_on_update " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER UPDATE OF " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">" ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN " </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"=" </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"-1" </span><span class="s1">+</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=old." </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
|
||||
<span class="s3">" AND " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">">0" </span><span class="s1">+ </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER increase_folder_count_on_insert " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER INSERT ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN " </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"=" </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">" + 1" </span><span class="s1">+</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=new." </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER decrease_folder_count_on_delete " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER DELETE ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN " </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"=" </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">"-1" </span><span class="s1">+</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=old." </span><span class="s1">+ NoteColumns.PARENT_ID +</span>
|
||||
<span class="s3">" AND " </span><span class="s1">+ NoteColumns.NOTES_COUNT + </span><span class="s3">">0;" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER update_note_content_on_insert " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER INSERT ON " </span><span class="s1">+ TABLE.DATA +</span>
|
||||
<span class="s3">" WHEN new." </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">"='" </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">"'" </span><span class="s1">+</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">"=new." </span><span class="s1">+ DataColumns.CONTENT +</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=new." </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER update_note_content_on_update " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER UPDATE ON " </span><span class="s1">+ TABLE.DATA +</span>
|
||||
<span class="s3">" WHEN old." </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">"='" </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">"'" </span><span class="s1">+</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">"=new." </span><span class="s1">+ DataColumns.CONTENT +</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=new." </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER update_note_content_on_delete " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER delete ON " </span><span class="s1">+ TABLE.DATA +</span>
|
||||
<span class="s3">" WHEN old." </span><span class="s1">+ DataColumns.MIME_TYPE + </span><span class="s3">"='" </span><span class="s1">+ DataConstants.NOTE + </span><span class="s3">"'" </span><span class="s1">+</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">"=''" </span><span class="s1">+</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">"=old." </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER delete_data_on_delete " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER DELETE ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" DELETE FROM " </span><span class="s1">+ TABLE.DATA +</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ DataColumns.NOTE_ID + </span><span class="s3">"=old." </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER folder_delete_notes_on_delete " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER DELETE ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" DELETE FROM " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"=old." </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"CREATE TRIGGER folder_move_notes_on_trash " </span><span class="s1">+</span>
|
||||
<span class="s3">" AFTER UPDATE ON " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" WHEN new." </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"=" </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
|
||||
<span class="s3">" BEGIN" </span><span class="s1">+</span>
|
||||
<span class="s3">" UPDATE " </span><span class="s1">+ TABLE.NOTE +</span>
|
||||
<span class="s3">" SET " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"=" </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
|
||||
<span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"=old." </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">";" </span><span class="s1">+</span>
|
||||
<span class="s3">" END"</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">"note table has been created"</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">"DROP TRIGGER IF EXISTS increase_folder_count_on_update"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS decrease_folder_count_on_update"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS delete_data_on_delete"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS increase_folder_count_on_insert"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS folder_move_notes_on_trash"</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">"data table has been created"</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">"DROP TRIGGER IF EXISTS update_note_content_on_insert"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS update_note_content_on_update"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS update_note_content_on_delete"</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">&& !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">"Upgrade notes database to version " </span><span class="s1">+ newVersion</span>
|
||||
<span class="s1">+ </span><span class="s3">"fails"</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">"DROP TABLE IF EXISTS " </span><span class="s1">+ TABLE.NOTE);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TABLE IF EXISTS " </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">"DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"</span><span class="s1">);</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"DROP TRIGGER IF EXISTS update_note_modified_date_on_update"</span><span class="s1">);</span>
|
||||
<span class="s0">// add a column for gtask id</span>
|
||||
<span class="s1">db.execSQL(</span><span class="s3">"ALTER TABLE " </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">" ADD COLUMN " </span><span class="s1">+ NoteColumns.GTASK_ID</span>
|
||||
<span class="s1">+ </span><span class="s3">" TEXT NOT NULL DEFAULT ''"</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">"ALTER TABLE " </span><span class="s1">+ TABLE.NOTE + </span><span class="s3">" ADD COLUMN " </span><span class="s1">+ NoteColumns.VERSION</span>
|
||||
<span class="s1">+ </span><span class="s3">" INTEGER NOT NULL DEFAULT 0"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"NotesProvider"</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">"note"</span><span class="s1">, URI_NOTE);</span>
|
||||
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">"note/#"</span><span class="s1">, URI_NOTE_ITEM);</span>
|
||||
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">"data"</span><span class="s1">, URI_DATA);</span>
|
||||
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">"data/#"</span><span class="s1">, URI_DATA_ITEM);</span>
|
||||
<span class="s1">mMatcher.addURI(Notes.AUTHORITY, </span><span class="s3">"search"</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">"/*"</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">","</span>
|
||||
<span class="s1">+ NoteColumns.ID + </span><span class="s3">" AS " </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + </span><span class="s3">","</span>
|
||||
<span class="s1">+ </span><span class="s3">"TRIM(REPLACE(" </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">", x'0A','')) AS " </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_TEXT_1 + </span><span class="s3">","</span>
|
||||
<span class="s1">+ </span><span class="s3">"TRIM(REPLACE(" </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">", x'0A','')) AS " </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_TEXT_2 + </span><span class="s3">","</span>
|
||||
<span class="s1">+ R.drawable.search_result + </span><span class="s3">" AS " </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_ICON_1 + </span><span class="s3">","</span>
|
||||
<span class="s1">+ </span><span class="s3">"'" </span><span class="s1">+ Intent.ACTION_VIEW + </span><span class="s3">"' AS " </span><span class="s1">+ SearchManager.SUGGEST_COLUMN_INTENT_ACTION + </span><span class="s3">","</span>
|
||||
<span class="s1">+ </span><span class="s3">"'" </span><span class="s1">+ Notes.TextNote.CONTENT_TYPE + </span><span class="s3">"' AS " </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">"SELECT " </span><span class="s1">+ NOTES_SEARCH_PROJECTION</span>
|
||||
<span class="s1">+ </span><span class="s3">" FROM " </span><span class="s1">+ TABLE.NOTE</span>
|
||||
<span class="s1">+ </span><span class="s3">" WHERE " </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">" LIKE ?"</span>
|
||||
<span class="s1">+ </span><span class="s3">" AND " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"<>" </span><span class="s1">+ Notes.ID_TRASH_FOLER</span>
|
||||
<span class="s1">+ </span><span class="s3">" AND " </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s3">"=" </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">"=" </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">"=" </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">"do not specify sortOrder, selection, selectionArgs, or projection" </span><span class="s1">+ </span><span class="s3">"with this query"</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() > </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">"pattern"</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">"%%%s%%"</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">"got exception: " </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">"Unknown URI " </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">"Wrong data format without note id:" </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">"Unknown URI " </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 > </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 > </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">"(" </span><span class="s1">+ selection + </span><span class="s3">") AND " </span><span class="s1">+ NoteColumns.ID + </span><span class="s3">">0 "</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 <= </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">"=" </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">"=" </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">"Unknown URI " </span><span class="s1">+ uri);</span>
|
||||
<span class="s1">}</span>
|
||||
<span class="s2">if </span><span class="s1">(count > </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">"=" </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">"=" </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">"Unknown URI " </span><span class="s1">+ uri);</span>
|
||||
<span class="s1">}</span>
|
||||
|
||||
<span class="s2">if </span><span class="s1">(count > </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">" AND (" </span><span class="s1">+ selection + </span><span class="s3">')' </span><span class="s1">: </span><span class="s3">""</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">"UPDATE "</span><span class="s1">);</span>
|
||||
<span class="s1">sql.append(TABLE.NOTE);</span>
|
||||
<span class="s1">sql.append(</span><span class="s3">" SET "</span><span class="s1">);</span>
|
||||
<span class="s1">sql.append(NoteColumns.VERSION);</span>
|
||||
<span class="s1">sql.append(</span><span class="s3">"=" </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s3">"+1 "</span><span class="s1">);</span>
|
||||
|
||||
<span class="s2">if </span><span class="s1">(id > </span><span class="s4">0 </span><span class="s1">|| !TextUtils.isEmpty(selection)) {</span>
|
||||
<span class="s1">sql.append(</span><span class="s3">" WHERE "</span><span class="s1">);</span>
|
||||
<span class="s1">}</span>
|
||||
<span class="s2">if </span><span class="s1">(id > </span><span class="s4">0</span><span class="s1">) {</span>
|
||||
<span class="s1">sql.append(NoteColumns.ID + </span><span class="s3">"=" </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 > </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">"</span><span class="s5">\\</span><span class="s3">?"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"failed to put related gid"</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">"failed to get related gid"</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">"MetaData:setContentByLocalJSON should not be called"</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">"MetaData:getLocalJSONFromContent should not be called"</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">"MetaData:getSyncAction should not be called"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">""</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">""</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">""</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">""</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">""</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">"it seems that we haven't created this in database yet"</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 && 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">"Get note id error :" </span><span class="s1">+ e.toString());</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"create note failed"</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() > </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">" ? in (SELECT " </span><span class="s1">+ NoteColumns.ID + </span><span class="s4">" FROM " </span><span class="s1">+ TABLE.NOTE</span>
|
||||
<span class="s1">+ </span><span class="s4">" WHERE " </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s4">"=?)"</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">"there is no update. maybe user updates note when syncing"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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<SqlData> 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">""</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<SqlData>();</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<SqlData>();</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<SqlData>();</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">"(_id=?)"</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">"loadFromCursor: cursor = null"</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">"(note_id=?)"</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">"it seems that the note has not data"</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">"loadDataContent: cursor = null"</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">"cannot set system folder"</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">""</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">""</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 < 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">"it seems that we haven't created this in database yet"</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 && 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">"Get note id error :" </span><span class="s1">+ e.toString());</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"create note failed"</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">"Create thread id failed"</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 <= </span><span class="s3">0 </span><span class="s1">&& mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) {</span>
|
||||
<span class="s1">Log.e(TAG, </span><span class="s4">"No such note"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalStateException(</span><span class="s4">"Try to update note with invalid id"</span><span class="s1">);</span>
|
||||
<span class="s1">}</span>
|
||||
<span class="s2">if </span><span class="s1">(mDiffNoteValues.size() > </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">"("</span>
|
||||
<span class="s1">+ NoteColumns.ID + </span><span class="s4">"=?)"</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">"("</span>
|
||||
<span class="s1">+ NoteColumns.ID + </span><span class="s4">"=?) AND (" </span><span class="s1">+ NoteColumns.VERSION + </span><span class="s4">"<=?)"</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">"there is no update. maybe user updates note when syncing"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"null"</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">"fail to generate task-create jsonobject"</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">"fail to generate task-update jsonobject"</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">"fail to get task content from jsonobject"</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">"setContentByLocalJSON: nothing is avaiable"</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">"invalid type"</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 < 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">"the note seems to be an empty one"</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 < 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">&& 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">&& 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">"it seems that note meta has been deleted"</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">"remote note id seems to be deleted"</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">"note id doesn't match"</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">"gtask id doesn't match"</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">&& getName().trim().length() > </span><span class="s4">0</span><span class="s1">)</span>
|
||||
<span class="s1">|| (getNotes() != </span><span class="s2">null </span><span class="s1">&& getNotes().trim().length() > </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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<Task> 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<Task>();</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">"null"</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">"fail to generate tasklist-create jsonobject"</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">"fail to generate tasklist-update jsonobject"</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">"fail to get tasklist content from jsonobject"</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">"setContentByLocalJSON: nothing is avaiable"</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">"invalid system folder"</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">"error type"</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">"gtask id doesn't match"</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">&& !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 < </span><span class="s3">0 </span><span class="s1">|| index > mChildren.size()) {</span>
|
||||
<span class="s1">Log.e(TAG, </span><span class="s4">"add child task: invalid index"</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">&& 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 < </span><span class="s3">0 </span><span class="s1">|| index >= mChildren.size()) {</span>
|
||||
<span class="s1">Log.e(TAG, </span><span class="s4">"move child task: invalid index"</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">"move child task: the task should in the list"</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) && 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 < 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 < </span><span class="s3">0 </span><span class="s1">|| index >= mChildren.size()) {</span>
|
||||
<span class="s1">Log.e(TAG, </span><span class="s4">"getTaskByIndex: invalid index"</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<Task> 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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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<Void, String, Integer> {</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"https://mail.google.com/tasks/"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String GTASK_GET_URL = </span><span class="s3">"https://mail.google.com/tasks/ig"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String GTASK_POST_URL = </span><span class="s3">"https://mail.google.com/tasks/r/ig"</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 < 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">&& !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">"already logged in"</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">"login google account failed"</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">"gmail.com"</span><span class="s1">) || mAccount.name.toLowerCase()</span>
|
||||
<span class="s1">.endsWith(</span><span class="s3">"googlemail.com"</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">"a/"</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">"/"</span><span class="s1">);</span>
|
||||
<span class="s1">mGetUrl = url.toString() + </span><span class="s3">"ig"</span><span class="s1">;</span>
|
||||
<span class="s1">mPostUrl = url.toString() + </span><span class="s3">"r/ig"</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">"com.google"</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">"there is no available google account"</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">"unable to get an account with the same name in the settings"</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<Bundle> accountManagerFuture = accountManager.getAuthToken(account,</span>
|
||||
<span class="s3">"goanna_mobile"</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">"com.google"</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">"get auth token failed"</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">"login google account failed"</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">"login gtask failed"</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">"?auth=" </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<Cookie> 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">"GTL"</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">"it seems that there is no auth cookie"</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">"_setup("</span><span class="s1">;</span>
|
||||
<span class="s1">String jsEnd = </span><span class="s3">")}</script>"</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">&& end != -</span><span class="s4">1 </span><span class="s1">&& begin < 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">"v"</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">"httpget gtask_url failed"</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">"Content-Type"</span><span class="s1">, </span><span class="s3">"application/x-www-form-urlencoded;charset=utf-8"</span><span class="s1">);</span>
|
||||
<span class="s1">httpPost.setHeader(</span><span class="s3">"AT"</span><span class="s1">, </span><span class="s3">"1"</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">"encoding: " </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">&& contentEncoding.equalsIgnoreCase(</span><span class="s3">"gzip"</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">&& contentEncoding.equalsIgnoreCase(</span><span class="s3">"deflate"</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">"please login first"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">"not logged in"</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<BasicNameValuePair> list = </span><span class="s2">new </span><span class="s1">LinkedList<BasicNameValuePair>();</span>
|
||||
<span class="s1">list.add(</span><span class="s2">new </span><span class="s1">BasicNameValuePair(</span><span class="s3">"r"</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">"UTF-8"</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">"postRequest failed"</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">"postRequest failed"</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">"unable to convert response content to jsonobject"</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">"error occurs when posting request"</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">"create task: handing jsonobject failed"</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">"create tasklist: handing jsonobject failed"</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">"commit update: handing jsonobject failed"</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">&& mUpdateArray.length() > </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 && 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">"move task: handing jsonobject failed"</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">"delete node: handing jsonobject failed"</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">"please login first"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s3">"not logged in"</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">"_setup("</span><span class="s1">;</span>
|
||||
<span class="s1">String jsEnd = </span><span class="s3">")}</script>"</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">&& end != -</span><span class="s4">1 </span><span class="s1">&& begin < 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">"t"</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">"gettasklists: httpget failed"</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">"gettasklists: httpget failed"</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">"get task lists: handing jasonobject failed"</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">"get task list: handing jsonobject failed"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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<String, TaskList> mGTaskListHashMap;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">HashMap<String, Node> mGTaskHashMap;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">HashMap<String, MetaData> mMetaHashMap;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">TaskList mMetaList;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">HashSet<Long> mLocalDeleteIdMap;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">HashMap<String, Long> mGidToNid;</span>
|
||||
|
||||
<span class="s2">private </span><span class="s1">HashMap<Long, String> 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<String, TaskList>();</span>
|
||||
<span class="s1">mGTaskHashMap = </span><span class="s2">new </span><span class="s1">HashMap<String, Node>();</span>
|
||||
<span class="s1">mMetaHashMap = </span><span class="s2">new </span><span class="s1">HashMap<String, MetaData>();</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<Long>();</span>
|
||||
<span class="s1">mGidToNid = </span><span class="s2">new </span><span class="s1">HashMap<String, Long>();</span>
|
||||
<span class="s1">mNidToGid = </span><span class="s2">new </span><span class="s1">HashMap<Long, String>();</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">"Sync is in progress"</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">"login google task failed"</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 < 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 < 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 < 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">&& !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 < 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">"initGTaskList: handing JSONObject failed"</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">"(type<>? AND parent_id=?)"</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">"failed to query trash folder"</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">"(type=? AND parent_id<>?)"</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">" DESC"</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">"failed to query existing note in database"</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<Map.Entry<String, Node>> iter = mGTaskHashMap.entrySet().iterator();</span>
|
||||
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
|
||||
<span class="s1">Map.Entry<String, Node> 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">"failed to batch-delete local deleted notes"</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">"failed to query root folder"</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">"(_id=?)"</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">"failed to query call note folder"</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">"(type=? AND parent_id<>?)"</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">" DESC"</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">"failed to query existing folder"</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<Map.Entry<String, TaskList>> iter = mGTaskListHashMap.entrySet().iterator();</span>
|
||||
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
|
||||
<span class="s1">Map.Entry<String, TaskList> 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">"unkown sync action type"</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 < 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">"cannot find task's parent id locally"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"cannot add local node"</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">"cannot find task's parent id locally"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"cannot update local node"</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">"cannot find task's parent tasklist"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"cannot add remote task"</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<Map.Entry<String, TaskList>> iter = mGTaskListHashMap.entrySet().iterator();</span>
|
||||
<span class="s2">while </span><span class="s1">(iter.hasNext()) {</span>
|
||||
<span class="s1">Map.Entry<String, TaskList> 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">"cannot find task's parent tasklist"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span><span class="s4">"cannot update remote task"</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">&& 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">"(type<>? AND parent_id<>?)"</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">" DESC"</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">"something is missed"</span><span class="s1">);</span>
|
||||
<span class="s2">throw new </span><span class="s1">ActionFailureException(</span>
|
||||
<span class="s4">"some local items don't have gid after sync"</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">"failed to query local note to refresh sync id"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"sync_action_type"</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">"net.micode.notes.gtask.remote.gtask_sync_service"</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">"isSyncing"</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">"progressMsg"</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">""</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">""</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">""</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">&& 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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"Note"</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">"Get note id error :" </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">"Wrong note id:" </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() > </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 <= </span><span class="s4">0</span><span class="s1">) {</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Wrong note id:" </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">"Update note error, should not happen"</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">&& (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">"NoteData"</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() > </span><span class="s4">0 </span><span class="s1">|| mCallDataValues.size() > </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 <= </span><span class="s4">0</span><span class="s1">) {</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Text data id should larger than 0"</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 <= </span><span class="s4">0</span><span class="s1">) {</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Call data id should larger than 0"</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 <= </span><span class="s4">0</span><span class="s1">) {</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Wrong note id:" </span><span class="s1">+ noteId);</span>
|
||||
<span class="s1">}</span>
|
||||
|
||||
<span class="s1">ArrayList<ContentProviderOperation> operationList = </span><span class="s2">new </span><span class="s1">ArrayList<ContentProviderOperation>();</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() > </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">"Insert new text data fail with noteId" </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() > </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">"Insert new call data fail with noteId" </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() > </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">"%s: %s"</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">"%s: %s"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"WorkingNote"</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">"No note with id:" </span><span class="s1">+ mNoteId);</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Unable to find note with id " </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">"=?"</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">"Wrong note type with type:" </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">"No data with id:" </span><span class="s1">+ mNoteId);</span>
|
||||
<span class="s2">throw new </span><span class="s1">IllegalArgumentException(</span><span class="s3">"Unable to find note's data with id " </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">"Create new note fail with id:" </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">&& mWidgetType != Notes.TYPE_WIDGET_INVALIDE</span>
|
||||
<span class="s1">&& 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 > </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() && TextUtils.isEmpty(mContent))</span>
|
||||
<span class="s1">|| (existInDatabase() && !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">&& mWidgetType != Notes.TYPE_WIDGET_INVALIDE && 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 > </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"BackupUtils"</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">""</span><span class="s1">;</span>
|
||||
<span class="s1">mFileDirectory = </span><span class="s3">""</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">"=?"</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">"=?"</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">"Media was not mounted"</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">"get print stream error"</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">"(" </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s3">"=" </span><span class="s1">+ Notes.TYPE_FOLDER + </span><span class="s3">" AND "</span>
|
||||
<span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"<>" </span><span class="s1">+ Notes.ID_TRASH_FOLER + </span><span class="s3">") OR "</span>
|
||||
<span class="s1">+ NoteColumns.ID + </span><span class="s3">"=" </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">""</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">"=" </span><span class="s1">+ +Notes.TYPE_NOTE + </span><span class="s3">" AND " </span><span class="s1">+ NoteColumns.PARENT_ID</span>
|
||||
<span class="s1">+ </span><span class="s3">"=0"</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">"create file to exported failed"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"DataUtils"</span><span class="s1">;</span>
|
||||
<span class="s2">public static boolean </span><span class="s1">batchDeleteNotes(ContentResolver resolver, HashSet<Long> 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">"the ids is null"</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">"no id is in the hashset"</span><span class="s1">);</span>
|
||||
<span class="s2">return true</span><span class="s1">;</span>
|
||||
<span class="s1">}</span>
|
||||
|
||||
<span class="s1">ArrayList<ContentProviderOperation> operationList = </span><span class="s2">new </span><span class="s1">ArrayList<ContentProviderOperation>();</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">"Don't delete system folder root"</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">"delete notes failed, ids:" </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">"%s: %s"</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">"%s: %s"</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<Long> 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">"the ids is null"</span><span class="s1">);</span>
|
||||
<span class="s2">return true</span><span class="s1">;</span>
|
||||
<span class="s1">}</span>
|
||||
|
||||
<span class="s1">ArrayList<ContentProviderOperation> operationList = </span><span class="s2">new </span><span class="s1">ArrayList<ContentProviderOperation>();</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">"delete notes failed, ids:" </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">"%s: %s"</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">"%s: %s"</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">"COUNT(*)" </span><span class="s1">},</span>
|
||||
<span class="s1">NoteColumns.TYPE + </span><span class="s3">"=? AND " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"<>?"</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">"get folder count failed:" </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">"=? AND " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"<>" </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() > </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() > </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() > </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">"=" </span><span class="s1">+ Notes.TYPE_FOLDER +</span>
|
||||
<span class="s3">" AND " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s3">"<>" </span><span class="s1">+ Notes.ID_TRASH_FOLER +</span>
|
||||
<span class="s3">" AND " </span><span class="s1">+ NoteColumns.SNIPPET + </span><span class="s3">"=?"</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() > </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<AppWidgetAttribute> 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">"=?"</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<AppWidgetAttribute> 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<AppWidgetAttribute>();</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">"=? AND " </span><span class="s1">+ CallNote.MIME_TYPE + </span><span class="s3">"=?"</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">&& 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">"Get call number fails " </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">""</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">"=? AND " </span><span class="s1">+ CallNote.MIME_TYPE + </span><span class="s3">"=? AND PHONE_NUMBERS_EQUAL("</span>
|
||||
<span class="s1">+ CallNote.PHONE_NUMBER + </span><span class="s3">",?)"</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">"Get call note id fails " </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">"=?"</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">""</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">"Note is not found with id: " </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"action_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_LIST = </span><span class="s3">"action_list"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ACTION_TYPE = </span><span class="s3">"action_type"</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">"create"</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">"get_all"</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">"move"</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">"update"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CREATOR_ID = </span><span class="s3">"creator_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CHILD_ENTITY = </span><span class="s3">"child_entity"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_CLIENT_VERSION = </span><span class="s3">"client_version"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_COMPLETED = </span><span class="s3">"completed"</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">"current_list_id"</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">"default_list_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DELETED = </span><span class="s3">"deleted"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEST_LIST = </span><span class="s3">"dest_list"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_DEST_PARENT = </span><span class="s3">"dest_parent"</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">"dest_parent_type"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ENTITY_DELTA = </span><span class="s3">"entity_delta"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ENTITY_TYPE = </span><span class="s3">"entity_type"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_GET_DELETED = </span><span class="s3">"get_deleted"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_ID = </span><span class="s3">"id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_INDEX = </span><span class="s3">"index"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LAST_MODIFIED = </span><span class="s3">"last_modified"</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">"latest_sync_point"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LIST_ID = </span><span class="s3">"list_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_LISTS = </span><span class="s3">"lists"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NAME = </span><span class="s3">"name"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NEW_ID = </span><span class="s3">"new_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_NOTES = </span><span class="s3">"notes"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_PARENT_ID = </span><span class="s3">"parent_id"</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">"prior_sibling_id"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_RESULTS = </span><span class="s3">"results"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_SOURCE_LIST = </span><span class="s3">"source_list"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TASKS = </span><span class="s3">"tasks"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE = </span><span class="s3">"type"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE_GROUP = </span><span class="s3">"GROUP"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_TYPE_TASK = </span><span class="s3">"TASK"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String GTASK_JSON_USER = </span><span class="s3">"user"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String MIUI_FOLDER_PREFFIX = </span><span class="s3">"[MIUI_Notes]"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String FOLDER_DEFAULT = </span><span class="s3">"Default"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String FOLDER_CALL_NOTE = </span><span class="s3">"Call_Note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String FOLDER_META = </span><span class="s3">"METADATA"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String META_HEAD_GTASK_ID = </span><span class="s3">"meta_gid"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String META_HEAD_NOTE = </span><span class="s3">"meta_note"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String META_HEAD_DATA = </span><span class="s3">"meta_data"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public final static </span><span class="s1">String META_NOTE_NAME = </span><span class="s3">"[META INFO] DON'T UPDATE AND DELETE"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 >= 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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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() > 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 & (</span><span class="s3">1 </span><span class="s1"><< 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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">">? AND " </span><span class="s1">+ NoteColumns.TYPE + </span><span class="s4">"=" </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 && oldVal == HOURS_IN_HALF_DAY - </span><span class="s3">1 </span><span class="s1">&& 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 && oldVal == HOURS_IN_HALF_DAY && 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">&& newVal == HOURS_IN_HALF_DAY ||</span>
|
||||
<span class="s1">oldVal == HOURS_IN_HALF_DAY && 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">&& 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">&& 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 && 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 && 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 >= 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() >= 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 && 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 && 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 && 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 > 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 && 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 >= 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 > 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 && 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 < 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">"MM.dd EEEE"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"NoteEditText"</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">"tel:" </span><span class="s1">;</span>
|
||||
<span class="s2">private static final </span><span class="s1">String SCHEME_HTTP = </span><span class="s3">"http:" </span><span class="s1">;</span>
|
||||
<span class="s2">private static final </span><span class="s1">String SCHEME_EMAIL = </span><span class="s3">"mailto:" </span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">Map<String, Integer> sSchemaActionResMap = </span><span class="s2">new </span><span class="s1">HashMap<String, Integer>();</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 && 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">"OnTextViewChangeListener was not seted"</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">"OnTextViewChangeListener was not seted"</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 && 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) >= </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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) > </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">""</span><span class="s1">).replace(</span>
|
||||
<span class="s1">NoteEditActivity.TAG_UNCHECKED, </span><span class="s4">""</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">""</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">""</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 && !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() > (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">"cursor move to previous but can't move back"</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 > </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 && !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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"NotesListAdapter"</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<Integer, Boolean> 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<Integer, Boolean>();</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 < 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<Long> getSelectedItemIds() {</span>
|
||||
<span class="s1">HashSet<Long> itemSet = </span><span class="s2">new </span><span class="s1">HashSet<Long>();</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">"Wrong item id, should not happen"</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<AppWidgetAttribute> getSelectedWidget() {</span>
|
||||
<span class="s1">HashSet<AppWidgetAttribute> itemSet = </span><span class="s2">new </span><span class="s1">HashSet<AppWidgetAttribute>();</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">"Invalid cursor"</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<Boolean> 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<Boolean> 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">&& 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 < 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">"Invalid cursor"</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 && 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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"notes_preferences"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">String PREFERENCE_SYNC_ACCOUNT_NAME = </span><span class="s3">"pref_key_account_name"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">public static final </span><span class="s1">String PREFERENCE_LAST_SYNC_TIME = </span><span class="s3">"pref_last_sync_time"</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">"pref_key_bg_random_appear"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String PREFERENCE_SYNC_ACCOUNT_KEY = </span><span class="s3">"pref_sync_account_key"</span><span class="s1">;</span>
|
||||
|
||||
<span class="s2">private static final </span><span class="s1">String AUTHORITIES_FILTER_KEY = </span><span class="s3">"authorities"</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">&& accounts.length > 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 > </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">"android.settings.ADD_ACCOUNT_SETTINGS"</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">"gmail-ls"</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">"com.google"</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">""</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">""</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">""</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">""</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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">"NoteWidgetProvider"</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 < 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">"=?"</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">"=? AND " </span><span class="s1">+ NoteColumns.PARENT_ID + </span><span class="s4">"<>?"</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 < 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">""</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">&& c.moveToFirst()) {</span>
|
||||
<span class="s2">if </span><span class="s1">(c.getCount() > </span><span class="s3">1</span><span class="s1">) {</span>
|
||||
<span class="s1">Log.e(TAG, </span><span class="s4">"Multiple message with same widget id:" </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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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 "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/</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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s2"><</span><span class="s4">manifest </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">xmlns:tools</span><span class="s3">="http://schemas.android.com/tools"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.POST_NOTIFICATIONS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.WRITE_EXTERNAL_STORAGE" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="com.android.launcher.permission.INSTALL_SHORTCUT" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.INTERNET" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.READ_CONTACTS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.MANAGE_ACCOUNTS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.AUTHENTICATE_ACCOUNTS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.GET_ACCOUNTS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.USE_CREDENTIALS" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">uses-permission </span><span class="s1">android:name</span><span class="s3">="android.permission.RECEIVE_BOOT_COMPLETED" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">application</span>
|
||||
<span class="s1">android:allowBackup</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:dataExtractionRules</span><span class="s3">="@xml/data_extraction_rules"</span>
|
||||
<span class="s1">android:fullBackupContent</span><span class="s3">="@xml/backup_rules"</span>
|
||||
<span class="s1">android:icon</span><span class="s3">="@mipmap/ic_launcher"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/app_name"</span>
|
||||
<span class="s1">android:roundIcon</span><span class="s3">="@mipmap/ic_launcher_round"</span>
|
||||
<span class="s1">android:supportsRtl</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:theme</span><span class="s3">="@style/Theme.MyApplication"</span>
|
||||
<span class="s1">tools:targetApi</span><span class="s3">="31"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">activity</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".ui.NotesListActivity"</span>
|
||||
<span class="s1">android:configChanges</span><span class="s3">="keyboardHidden|orientation|screenSize"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/app_name"</span>
|
||||
<span class="s1">android:launchMode</span><span class="s3">="singleTop"</span>
|
||||
<span class="s1">android:theme</span><span class="s3">="@style/NoteTheme"</span>
|
||||
<span class="s1">android:uiOptions</span><span class="s3">="splitActionBarWhenNarrow"</span>
|
||||
<span class="s1">android:windowSoftInputMode</span><span class="s3">="adjustPan"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="true"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.MAIN" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">="android.intent.category.LAUNCHER" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s4">activity</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">activity</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".ui.NoteEditActivity"</span>
|
||||
<span class="s1">android:configChanges</span><span class="s3">="keyboardHidden|orientation|screenSize"</span>
|
||||
<span class="s1">android:launchMode</span><span class="s3">="singleTop"</span>
|
||||
<span class="s1">android:theme</span><span class="s3">="@style/NoteTheme"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="true"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.VIEW" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">="android.intent.category.DEFAULT" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">="vnd.android.cursor.item/text_note" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">="vnd.android.cursor.item/call_note" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.INSERT_OR_EDIT" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">="android.intent.category.DEFAULT" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">="vnd.android.cursor.item/text_note" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">data </span><span class="s1">android:mimeType</span><span class="s3">="vnd.android.cursor.item/call_note" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.SEARCH" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">category </span><span class="s1">android:name</span><span class="s3">="android.intent.category.DEFAULT" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">meta-data</span>
|
||||
<span class="s1">android:name</span><span class="s3">="android.app.searchable"</span>
|
||||
<span class="s1">android:resource</span><span class="s3">="@xml/searchable" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">activity</span><span class="s2">></span>
|
||||
|
||||
|
||||
<span class="s2"><</span><span class="s4">provider</span>
|
||||
<span class="s1">android:name</span><span class="s3">="net.micode.notes.data.NotesProvider"</span>
|
||||
<span class="s1">android:authorities</span><span class="s3">="micode_notes"</span>
|
||||
<span class="s1">android:multiprocess</span><span class="s3">="true" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">receiver</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".widget.NoteWidgetProvider_2x"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/app_widget2x2"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="true"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.appwidget.action.APPWIDGET_UPDATE" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.appwidget.action.APPWIDGET_DELETED" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.PRIVACY_MODE_CHANGED" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">meta-data</span>
|
||||
<span class="s1">android:name</span><span class="s3">="android.appwidget.provider"</span>
|
||||
<span class="s1">android:resource</span><span class="s3">="@xml/widget_2x_info" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">receiver</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">receiver</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".widget.NoteWidgetProvider_4x"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/app_widget4x4"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="true"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.appwidget.action.APPWIDGET_UPDATE" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.appwidget.action.APPWIDGET_DELETED" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.PRIVACY_MODE_CHANGED" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">meta-data</span>
|
||||
<span class="s1">android:name</span><span class="s3">="android.appwidget.provider"</span>
|
||||
<span class="s1">android:resource</span><span class="s3">="@xml/widget_4x_info" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">receiver</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">receiver</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".ui.AlarmInitReceiver"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="true"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">action </span><span class="s1">android:name</span><span class="s3">="android.intent.action.BOOT_COMPLETED" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">intent-filter</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s4">receiver</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">receiver</span>
|
||||
<span class="s1">android:name</span><span class="s3">="net.micode.notes.ui.AlarmReceiver"</span>
|
||||
<span class="s1">android:process</span><span class="s3">=":remote"</span><span class="s2">></</span><span class="s4">receiver</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">activity</span>
|
||||
<span class="s1">android:name</span><span class="s3">=".ui.AlarmAlertActivity"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/app_name"</span>
|
||||
<span class="s1">android:launchMode</span><span class="s3">="singleInstance"</span>
|
||||
<span class="s1">android:theme</span><span class="s3">="@android:style/Theme.Holo.Wallpaper.NoTitleBar"</span><span class="s2">></</span><span class="s4">activity</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">activity</span>
|
||||
<span class="s1">android:name</span><span class="s3">="net.micode.notes.ui.NotesPreferenceActivity"</span>
|
||||
<span class="s1">android:label</span><span class="s3">="@string/preferences_title"</span>
|
||||
<span class="s1">android:launchMode</span><span class="s3">="singleTop"</span>
|
||||
<span class="s1">android:theme</span><span class="s3">="@android:style/Theme.Holo.Light"</span><span class="s2">></</span><span class="s4">activity</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">service</span>
|
||||
<span class="s1">android:name</span><span class="s3">="net.micode.notes.gtask.remote.GTaskSyncService"</span>
|
||||
<span class="s1">android:exported</span><span class="s3">="false"</span><span class="s2">></</span><span class="s4">service</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">meta-data</span>
|
||||
<span class="s1">android:name</span><span class="s3">="android.app.default_searchable"</span>
|
||||
<span class="s1">android:value</span><span class="s3">=".ui.NoteEditActivity" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s5"><!-- <activity--></span>
|
||||
<span class="s5"><!-- android:name=".MainActivity"--></span>
|
||||
<span class="s5"><!-- android:exported="true">--></span>
|
||||
<span class="s5"><!-- <intent-filter>--></span>
|
||||
<span class="s5"><!-- <action android:name="android.intent.action.MAIN" />--></span>
|
||||
|
||||
<span class="s5"><!-- <category android:name="android.intent.category.LAUNCHER" />--></span>
|
||||
<span class="s5"><!-- </intent-filter>--></span>
|
||||
<span class="s5"><!-- </activity>--></span>
|
||||
|
||||
<span class="s2"></</span><span class="s4">application</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"></</span><span class="s4">manifest</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="UTF-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:state_pressed</span><span class="s3">="true" </span><span class="s1">android:color</span><span class="s3">="#88555555" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:state_selected</span><span class="s3">="true" </span><span class="s1">android:color</span><span class="s3">="#ff999999" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:color</span><span class="s3">="#ff000000" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">selector</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="UTF-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:color</span><span class="s3">="#50000000" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">selector</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s2"><</span><span class="s4">vector </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:width</span><span class="s3">="108dp"</span>
|
||||
<span class="s1">android:height</span><span class="s3">="108dp"</span>
|
||||
<span class="s1">android:viewportWidth</span><span class="s3">="108"</span>
|
||||
<span class="s1">android:viewportHeight</span><span class="s3">="108"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#3DDC84"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,0h108v108h-108z" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M9,0L9,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,0L19,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M29,0L29,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M39,0L39,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M49,0L49,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M59,0L59,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M69,0L69,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M79,0L79,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M89,0L89,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M99,0L99,108"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,9L108,9"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,19L108,19"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,29L108,29"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,39L108,39"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,49L108,49"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,59L108,59"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,69L108,69"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,79L108,79"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,89L108,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M0,99L108,99"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,29L89,29"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,39L89,39"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,49L89,49"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,59L89,59"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,69L89,69"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M19,79L89,79"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M29,19L29,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M39,19L39,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M49,19L49,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M59,19L59,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M69,19L69,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">path</span>
|
||||
<span class="s1">android:fillColor</span><span class="s3">="#00000000"</span>
|
||||
<span class="s1">android:pathData</span><span class="s3">="M79,19L79,89"</span>
|
||||
<span class="s1">android:strokeWidth</span><span class="s3">="0.8"</span>
|
||||
<span class="s1">android:strokeColor</span><span class="s3">="#33FFFFFF" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">vector</span><span class="s2">></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"><</span><span class="s1">vector </span><span class="s2">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s2">xmlns:aapt</span><span class="s3">="http://schemas.android.com/aapt"</span>
|
||||
<span class="s2">android:width</span><span class="s3">="108dp"</span>
|
||||
<span class="s2">android:height</span><span class="s3">="108dp"</span>
|
||||
<span class="s2">android:viewportWidth</span><span class="s3">="108"</span>
|
||||
<span class="s2">android:viewportHeight</span><span class="s3">="108"</span><span class="s0">></span>
|
||||
<span class="s0"><</span><span class="s1">path </span><span class="s2">android:pathData</span><span class="s3">="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"</span><span class="s0">></span>
|
||||
<span class="s0"><</span><span class="s1">aapt:attr </span><span class="s2">name</span><span class="s3">="android:fillColor"</span><span class="s0">></span>
|
||||
<span class="s0"><</span><span class="s1">gradient</span>
|
||||
<span class="s2">android:endX</span><span class="s3">="85.84757"</span>
|
||||
<span class="s2">android:endY</span><span class="s3">="92.4963"</span>
|
||||
<span class="s2">android:startX</span><span class="s3">="42.9492"</span>
|
||||
<span class="s2">android:startY</span><span class="s3">="49.59793"</span>
|
||||
<span class="s2">android:type</span><span class="s3">="linear"</span><span class="s0">></span>
|
||||
<span class="s0"><</span><span class="s1">item</span>
|
||||
<span class="s2">android:color</span><span class="s3">="#44000000"</span>
|
||||
<span class="s2">android:offset</span><span class="s3">="0.0" </span><span class="s0">/></span>
|
||||
<span class="s0"><</span><span class="s1">item</span>
|
||||
<span class="s2">android:color</span><span class="s3">="#00000000"</span>
|
||||
<span class="s2">android:offset</span><span class="s3">="1.0" </span><span class="s0">/></span>
|
||||
<span class="s0"></</span><span class="s1">gradient</span><span class="s0">></span>
|
||||
<span class="s0"></</span><span class="s1">aapt:attr</span><span class="s0">></span>
|
||||
<span class="s0"></</span><span class="s1">path</span><span class="s0">></span>
|
||||
<span class="s0"><</span><span class="s1">path</span>
|
||||
<span class="s2">android:fillColor</span><span class="s3">="#FFFFFF"</span>
|
||||
<span class="s2">android:fillType</span><span class="s3">="nonZero"</span>
|
||||
<span class="s2">android:pathData</span><span class="s3">="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"</span>
|
||||
<span class="s2">android:strokeWidth</span><span class="s3">="1"</span>
|
||||
<span class="s2">android:strokeColor</span><span class="s3">="#00000000" </span><span class="s0">/></span>
|
||||
<span class="s0"></</span><span class="s1">vector</span><span class="s0">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">selector </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:state_pressed</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:drawable</span><span class="s3">="@drawable/new_note_pressed" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:drawable</span><span class="s3">="@drawable/new_note_normal" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">selector</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/account_dialog_title"</span>
|
||||
<span class="s1">style</span><span class="s3">="?android:attr/textAppearanceMedium"</span>
|
||||
<span class="s1">android:singleLine</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:ellipsize</span><span class="s3">="end"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:layout_marginTop</span><span class="s3">="-2.7dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="-2.7dip"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/account_dialog_subtitle"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginTop</span><span class="s3">="5dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="1dip"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s2"><</span><span class="s4">androidx.constraintlayout.widget.ConstraintLayout </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">xmlns:app</span><span class="s3">="http://schemas.android.com/apk/res-auto"</span>
|
||||
<span class="s1">xmlns:tools</span><span class="s3">="http://schemas.android.com/tools"</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/main"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">tools:context</span><span class="s3">=".MainActivity"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s4">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="Hello World!"</span>
|
||||
<span class="s1">app:layout_constraintBottom_toBottomOf</span><span class="s3">="parent"</span>
|
||||
<span class="s1">app:layout_constraintEnd_toEndOf</span><span class="s3">="parent"</span>
|
||||
<span class="s1">app:layout_constraintStart_toStartOf</span><span class="s3">="parent"</span>
|
||||
<span class="s1">app:layout_constraintTop_toTopOf</span><span class="s3">="parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"></</span><span class="s4">androidx.constraintlayout.widget.ConstraintLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:minHeight</span><span class="s3">="50dip"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="?android:attr/textAppearanceMedium"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/preferences_add_account" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
<span class="s2"><</span><span class="s5">LinearLayout </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="horizontal"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_horizontal"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">NumberPicker</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/date"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="120dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:focusableInTouchMode</span><span class="s3">="true"</span>
|
||||
<span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">NumberPicker</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/hour"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="50dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="5dip"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:focusableInTouchMode</span><span class="s3">="true"</span>
|
||||
<span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">NumberPicker</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/minute"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="50dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="5dip"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:focusableInTouchMode</span><span class="s3">="true"</span>
|
||||
<span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">NumberPicker</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/amPm"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="50dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="5dip"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:focusableInTouchMode</span><span class="s3">="true"</span>
|
||||
<span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">EditText</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/et_foler_name"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:hint</span><span class="s3">="@string/hint_foler_name"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent" </span><span class="s2">/></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:minHeight</span><span class="s3">="50dip" </span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_folder_name"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearancePrimaryItem" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/list_background"</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/note_title"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_modified_date"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="left|center_vertical"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="8dip"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceSecondaryItem" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_alert_icon"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/title_alert" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_alert_date"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="2dip"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="8dip"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceSecondaryItem" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageButton</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/bg_btn_set_color" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/sv_note_edit"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="7dip"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/bg_color_btn_mask" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ScrollView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="left|top"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:fadingEdgeLength</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:overScrollMode</span><span class="s3">="never"</span>
|
||||
<span class="s1">android:scrollbars</span><span class="s3">="none"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">net.micode.notes.ui.NoteEditText</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/note_edit_view"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:autoLink</span><span class="s3">="all"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@null"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="left|top"</span>
|
||||
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">="1.2"</span>
|
||||
<span class="s1">android:linksClickable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:minLines</span><span class="s3">="12"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearancePrimaryItem" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/note_edit_list"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="-10dip"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">ScrollView</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="7dip"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/bg_color_btn_mask" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageButton</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/add_img_btn"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="7dp"</span>
|
||||
<span class="s1">android:layout_marginTop</span><span class="s3">="600dp"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="7dp"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@android:drawable/ic_menu_gallery" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/btn_set_bg_color"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="43dip"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/bg_color_btn_mask"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="top|right" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/note_bg_color_selector"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/note_edit_color_selector_panel"</span>
|
||||
<span class="s1">android:layout_marginTop</span><span class="s3">="30dip"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="8dip"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="top|right"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_yellow"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_yellow_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="5dip"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_blue"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_blue_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="3dip"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_white"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_white_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="2dip"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_green"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_green_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_red"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_bg_red_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/font_size_selector"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/font_size_selector_bg"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/ll_font_small"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/font_small"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="5dip" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/menu_font_small"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceUnderMenuIcon" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_small_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="6dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="-7dip"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/ll_font_normal"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/font_normal"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="5dip" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/menu_font_normal"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceUnderMenuIcon" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_medium_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="6dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="-7dip"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/ll_font_large"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/font_large"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="5dip" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/menu_font_large"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceUnderMenuIcon" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_large_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="6dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="-7dip"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/ll_font_super"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/font_super"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="5dip" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/menu_font_super"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceUnderMenuIcon" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_super_select"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom|right"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="6dip"</span>
|
||||
<span class="s1">android:layout_marginBottom</span><span class="s3">="-7dip"</span>
|
||||
<span class="s1">android:src</span><span class="s3">="@drawable/selected" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">CheckBox</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/cb_edit_item"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="28dip"</span>
|
||||
<span class="s1">android:checked</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="top|left" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">net.micode.notes.ui.NoteEditText</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/et_edit_text"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">="1.2"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearancePrimaryItem"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@null" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/note_item"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center_vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_name"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearancePrimaryItem"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center_vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_title"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:singleLine</span><span class="s3">="true" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_time"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:textAppearance</span><span class="s3">="@style/TextAppearanceSecondaryItem" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">CheckBox</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@android:id/checkbox"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:clickable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/iv_alert_icon"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="top|right"</span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">xmlns:tools</span><span class="s3">="http://schemas.android.com/tools"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span><span class="s2">></span>
|
||||
<span class="s4"><!-- android:background="@drawable/list_background">--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/tv_title_bar"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/title_bar_bg"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="center_vertical"</span>
|
||||
<span class="s1">android:singleLine</span><span class="s3">="true"</span>
|
||||
<span class="s1">android:textColor</span><span class="s3">="#FFEAD1AE"</span>
|
||||
<span class="s1">android:textSize</span><span class="s3">="@dimen/text_font_size_medium" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ListView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/notes_list"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="0dip"</span>
|
||||
<span class="s1">android:layout_weight</span><span class="s3">="1"</span>
|
||||
<span class="s1">android:cacheColorHint</span><span class="s3">="@null"</span>
|
||||
<span class="s1">android:divider</span><span class="s3">="@null"</span>
|
||||
<span class="s1">android:fadingEdge</span><span class="s3">="@null"</span>
|
||||
<span class="s1">android:listSelector</span><span class="s3">="@android:color/transparent"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="visible"</span>
|
||||
<span class="s1">tools:visibility</span><span class="s3">="visible" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">Button</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/btn_new_note"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="490dp"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">='183dp'</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="bottom"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/new_note"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="visible"</span>
|
||||
<span class="s1">tools:visibility</span><span class="s3">="visible" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></span>
|
||||
<span class="s4"><!-- android:layout_width="match_parent"--></span>
|
||||
<span class="s4"><!-- android:layout_height="wrap_content"--></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/navigation_bar"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="horizontal"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">Button</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/selection_menu"</span>
|
||||
<span class="s1">style</span><span class="s3">="?android:attr/borderlessButtonStyle"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="match_parent"</span>
|
||||
<span class="s1">android:divider</span><span class="s3">="?android:attr/listDividerAlertDialog"</span>
|
||||
<span class="s1">android:gravity</span><span class="s3">="left|center_vertical"</span>
|
||||
<span class="s1">android:singleLine</span><span class="s3">="true" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">View</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="100dip"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="invisible"</span>
|
||||
<span class="s1">android:focusable</span><span class="s3">="false"</span>
|
||||
<span class="s1">android:background</span><span class="s3">="@drawable/list_footer_bg" </span><span class="s2">/></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">LinearLayout</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:orientation</span><span class="s3">="vertical"</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">Button</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/preference_sync_button"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_marginTop</span><span class="s3">="15dip"</span>
|
||||
<span class="s1">android:layout_marginLeft</span><span class="s3">="30dip"</span>
|
||||
<span class="s1">android:layout_marginRight</span><span class="s3">="30dip"</span>
|
||||
<span class="s1">style</span><span class="s3">="?android:attr/textAppearanceMedium"</span>
|
||||
<span class="s1">android:text</span><span class="s3">="@string/preferences_button_sync_immediately"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/prefenerece_sync_status_textview"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="wrap_content"</span>
|
||||
<span class="s1">android:layout_gravity</span><span class="s3">="center"</span>
|
||||
<span class="s1">android:visibility</span><span class="s3">="gone"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"></</span><span class="s5">LinearLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="146dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="146dip"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/widget_bg_image"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/widget_text"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:paddingTop</span><span class="s3">="20dip"</span>
|
||||
<span class="s1">android:paddingLeft</span><span class="s3">="15dip"</span>
|
||||
<span class="s1">android:paddingRight</span><span class="s3">="15dip"</span>
|
||||
<span class="s1">android:textSize</span><span class="s3">="14sp"</span>
|
||||
<span class="s1">android:textColor</span><span class="s3">="#FF663300"</span>
|
||||
<span class="s1">android:maxLines</span><span class="s3">="6"</span>
|
||||
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">="1.2" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">FrameLayout</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="294dip"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="294dip"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">ImageView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/widget_bg_image"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">TextView</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/widget_text"</span>
|
||||
<span class="s1">android:layout_width</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:layout_height</span><span class="s3">="fill_parent"</span>
|
||||
<span class="s1">android:paddingTop</span><span class="s3">="40dip"</span>
|
||||
<span class="s1">android:paddingLeft</span><span class="s3">="15dip"</span>
|
||||
<span class="s1">android:paddingRight</span><span class="s3">="15dip"</span>
|
||||
<span class="s1">android:textSize</span><span class="s3">="14sp"</span>
|
||||
<span class="s1">android:textColor</span><span class="s3">="#FF663300"</span>
|
||||
<span class="s1">android:maxLines</span><span class="s3">="12"</span>
|
||||
<span class="s1">android:lineSpacingMultiplier</span><span class="s3">="1.2" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">FrameLayout</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_delete"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_delete" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_font_size"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_font_size"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_list_mode"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_list_mode" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_share"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_share"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_send_to_desktop"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_send_to_desktop"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_alert"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_alert" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_delete_remind"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_remove_remind" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_search"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_search" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_new_note"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/notelist_menu_new"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_delete"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_delete"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_font_size"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_font_size"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_list_mode"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_list_mode" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_share"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_share"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_send_to_desktop"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_send_to_desktop"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_alert"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_alert" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_delete_remind"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_remove_remind" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_new_folder"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_create_folder"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_export_text"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_export_text"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_sync"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_sync"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_setting"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_setting" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_search"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_search"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_moon"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_moon"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_green"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_green"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_ship"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_ship"</span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item </span><span class="s1">android:id</span><span class="s3">="@+id/action_select_all" </span><span class="s1">android:title</span><span class="s3">="@string/menu_select_all" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/move"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_move"</span>
|
||||
<span class="s1">android:icon</span><span class="s3">="@drawable/menu_move"</span>
|
||||
<span class="s1">android:showAsAction</span><span class="s3">="always|withText" </span><span class="s2">/></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/delete"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/menu_delete"</span>
|
||||
<span class="s1">android:icon</span><span class="s3">="@drawable/menu_delete"</span>
|
||||
<span class="s1">android:showAsAction</span><span class="s3">="always|withText" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
|
||||
<span class="s4"><!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
--></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">menu</span>
|
||||
<span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
|
||||
<span class="s2"><</span><span class="s5">item</span>
|
||||
<span class="s1">android:id</span><span class="s3">="@+id/menu_new_note"</span>
|
||||
<span class="s1">android:title</span><span class="s3">="@string/notelist_menu_new"</span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s5">menu</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s2"><</span><span class="s4">adaptive-icon </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">background </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_background" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">foreground </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_foreground" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">monochrome </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_foreground" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">adaptive-icon</span><span class="s2">></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"><?</span><span class="s1">xml version</span><span class="s3">="1.0" </span><span class="s1">encoding</span><span class="s3">="utf-8"</span><span class="s0">?></span>
|
||||
<span class="s2"><</span><span class="s4">adaptive-icon </span><span class="s1">xmlns:android</span><span class="s3">="http://schemas.android.com/apk/res/android"</span><span class="s2">></span>
|
||||
<span class="s2"><</span><span class="s4">background </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_background" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">foreground </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_foreground" </span><span class="s2">/></span>
|
||||
<span class="s2"><</span><span class="s4">monochrome </span><span class="s1">android:drawable</span><span class="s3">="@drawable/ic_launcher_foreground" </span><span class="s2">/></span>
|
||||
<span class="s2"></</span><span class="s4">adaptive-icon</span><span class="s2">></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 @@
|
||||
<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…
Reference in new issue