@ -0,0 +1,282 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.micode.notes.data;
|
||||
|
||||
import android.net.Uri;
|
||||
public class Notes {
|
||||
public static final String AUTHORITY = "micode_notes";
|
||||
public static final String TAG = "Notes";
|
||||
public static final int TYPE_NOTE = 0;
|
||||
public static final int TYPE_FOLDER = 1;
|
||||
public static final int TYPE_SYSTEM = 2;
|
||||
|
||||
/**
|
||||
* Following IDs are system folders' identifiers
|
||||
* {@link Notes#ID_ROOT_FOLDER } is default folder
|
||||
* {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder
|
||||
* {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records
|
||||
*/
|
||||
public static final int ID_ROOT_FOLDER = 0;
|
||||
public static final int ID_TEMPARAY_FOLDER = -1;
|
||||
public static final int ID_CALL_RECORD_FOLDER = -2;
|
||||
public static final int ID_TRASH_FOLER = -3;
|
||||
|
||||
public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date";
|
||||
public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id";
|
||||
public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id";
|
||||
public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type";
|
||||
public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id";
|
||||
public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date";
|
||||
public static final String INTENT_EXTRA_TEMPLE_TEXT="net.micode.notes.temple_text";
|
||||
|
||||
public static final int TYPE_WIDGET_INVALIDE = -1;
|
||||
public static final int TYPE_WIDGET_2X = 0;
|
||||
public static final int TYPE_WIDGET_4X = 1;
|
||||
|
||||
public static class DataConstants {
|
||||
public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
|
||||
public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uri to query all notes and folders
|
||||
*/
|
||||
public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note");
|
||||
|
||||
/**
|
||||
* Uri to query data
|
||||
*/
|
||||
public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
|
||||
|
||||
public interface NoteColumns {
|
||||
/**
|
||||
* The unique ID for a row
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String ID = "_id";
|
||||
|
||||
/**
|
||||
* The parent's id for note or folder
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String PARENT_ID = "parent_id";
|
||||
|
||||
/**
|
||||
* Created data for note or folder
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String CREATED_DATE = "created_date";
|
||||
|
||||
/**
|
||||
* Latest modified date
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String MODIFIED_DATE = "modified_date";
|
||||
|
||||
|
||||
/**
|
||||
* Alert date
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String ALERTED_DATE = "alert_date";
|
||||
|
||||
/**
|
||||
* Folder's name or text content of note
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String SNIPPET = "snippet";
|
||||
|
||||
/**
|
||||
* Note's widget id
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String WIDGET_ID = "widget_id";
|
||||
|
||||
/**
|
||||
* Note's widget type
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String WIDGET_TYPE = "widget_type";
|
||||
|
||||
/**
|
||||
* Note's background color's id
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String BG_COLOR_ID = "bg_color_id";
|
||||
|
||||
/**
|
||||
* For text note, it doesn't has attachment, for multi-media
|
||||
* note, it has at least one attachment
|
||||
* <P> Type: INTEGER </P>
|
||||
*/
|
||||
public static final String HAS_ATTACHMENT = "has_attachment";
|
||||
|
||||
/**
|
||||
* Folder's count of notes
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String NOTES_COUNT = "notes_count";
|
||||
|
||||
/**
|
||||
* The file type: folder or note
|
||||
* <P> Type: INTEGER </P>
|
||||
*/
|
||||
public static final String TYPE = "type";
|
||||
|
||||
/**
|
||||
* The last sync id
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String SYNC_ID = "sync_id";
|
||||
|
||||
/**
|
||||
* Sign to indicate local modified or not
|
||||
* <P> Type: INTEGER </P>
|
||||
*/
|
||||
public static final String LOCAL_MODIFIED = "local_modified";
|
||||
|
||||
/**
|
||||
* Original parent id before moving into temporary folder
|
||||
* <P> Type : INTEGER </P>
|
||||
*/
|
||||
public static final String ORIGIN_PARENT_ID = "origin_parent_id";
|
||||
|
||||
/**
|
||||
* The gtask id
|
||||
* <P> Type : TEXT </P>
|
||||
*/
|
||||
public static final String GTASK_ID = "gtask_id";
|
||||
|
||||
/**
|
||||
* The version code
|
||||
* <P> Type : INTEGER (long) </P>
|
||||
*/
|
||||
public static final String VERSION = "version";
|
||||
|
||||
public static final String PASSWORD= "password";
|
||||
}
|
||||
|
||||
public interface DataColumns {
|
||||
/**
|
||||
* The unique ID for a row
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String ID = "_id";
|
||||
|
||||
/**
|
||||
* The MIME type of the item represented by this row.
|
||||
* <P> Type: Text </P>
|
||||
*/
|
||||
public static final String MIME_TYPE = "mime_type";
|
||||
|
||||
/**
|
||||
* The reference id to note that this data belongs to
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String NOTE_ID = "note_id";
|
||||
|
||||
/**
|
||||
* Created data for note or folder
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String CREATED_DATE = "created_date";
|
||||
|
||||
/**
|
||||
* Latest modified date
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String MODIFIED_DATE = "modified_date";
|
||||
|
||||
/**
|
||||
* Data's content
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String CONTENT = "content";
|
||||
|
||||
|
||||
/**
|
||||
* Generic data column, the meaning is {@link #MIMETYPE} specific, used for
|
||||
* integer data type
|
||||
* <P> Type: INTEGER </P>
|
||||
*/
|
||||
public static final String DATA1 = "data1";
|
||||
|
||||
/**
|
||||
* Generic data column, the meaning is {@link #MIMETYPE} specific, used for
|
||||
* integer data type
|
||||
* <P> Type: INTEGER </P>
|
||||
*/
|
||||
public static final String DATA2 = "data2";
|
||||
|
||||
/**
|
||||
* Generic data column, the meaning is {@link #MIMETYPE} specific, used for
|
||||
* TEXT data type
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String DATA3 = "data3";
|
||||
|
||||
/**
|
||||
* Generic data column, the meaning is {@link #MIMETYPE} specific, used for
|
||||
* TEXT data type
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String DATA4 = "data4";
|
||||
|
||||
/**
|
||||
* Generic data column, the meaning is {@link #MIMETYPE} specific, used for
|
||||
* TEXT data type
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String DATA5 = "data5";
|
||||
}
|
||||
|
||||
public static final class TextNote implements DataColumns {
|
||||
/**
|
||||
* Mode to indicate the text in check list mode or not
|
||||
* <P> Type: Integer 1:check list mode 0: normal mode </P>
|
||||
*/
|
||||
public static final String MODE = DATA1;
|
||||
|
||||
public static final int MODE_CHECK_LIST = 1;
|
||||
|
||||
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note";
|
||||
|
||||
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
|
||||
|
||||
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
|
||||
}
|
||||
|
||||
public static final class CallNote implements DataColumns {
|
||||
/**
|
||||
* Call date for this record
|
||||
* <P> Type: INTEGER (long) </P>
|
||||
*/
|
||||
public static final String CALL_DATE = DATA1;
|
||||
|
||||
/**
|
||||
* Phone number for this record
|
||||
* <P> Type: TEXT </P>
|
||||
*/
|
||||
public static final String PHONE_NUMBER = DATA3;
|
||||
|
||||
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note";
|
||||
|
||||
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note";
|
||||
|
||||
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
|
||||
}
|
||||
}
|
@ -0,0 +1,372 @@
|
||||
/*
|
||||
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.micode.notes.data;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteOpenHelper;
|
||||
import android.util.Log;
|
||||
|
||||
import net.micode.notes.data.Notes.DataColumns;
|
||||
import net.micode.notes.data.Notes.DataConstants;
|
||||
import net.micode.notes.data.Notes.NoteColumns;
|
||||
|
||||
|
||||
public class NotesDatabaseHelper extends SQLiteOpenHelper {
|
||||
private static final String DB_NAME = "note.db";
|
||||
|
||||
private static final int DB_VERSION = 5;
|
||||
|
||||
public interface TABLE {
|
||||
public static final String NOTE = "note";
|
||||
|
||||
public static final String DATA = "data";
|
||||
}
|
||||
|
||||
private static final String TAG = "NotesDatabaseHelper";
|
||||
|
||||
private static NotesDatabaseHelper mInstance;
|
||||
|
||||
private static final String CREATE_NOTE_TABLE_SQL =
|
||||
"CREATE TABLE " + TABLE.NOTE + "(" +
|
||||
NoteColumns.ID + " INTEGER PRIMARY KEY," +
|
||||
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
|
||||
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
|
||||
NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
|
||||
NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
|
||||
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
|
||||
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.PASSWORD + " TEXT DEFAULT NULL " +
|
||||
")";
|
||||
|
||||
private static final String CREATE_DATA_TABLE_SQL =
|
||||
"CREATE TABLE " + TABLE.DATA + "(" +
|
||||
DataColumns.ID + " INTEGER PRIMARY KEY," +
|
||||
DataColumns.MIME_TYPE + " TEXT NOT NULL," +
|
||||
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
|
||||
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
|
||||
NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
|
||||
DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +
|
||||
DataColumns.DATA1 + " INTEGER," +
|
||||
DataColumns.DATA2 + " INTEGER," +
|
||||
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
|
||||
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
|
||||
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
|
||||
")";
|
||||
|
||||
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
|
||||
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
|
||||
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
|
||||
|
||||
/**
|
||||
* Increase folder's note count when move note to the folder
|
||||
*/
|
||||
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
|
||||
"CREATE TRIGGER increase_folder_count_on_update "+
|
||||
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
|
||||
" BEGIN " +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
|
||||
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Decrease folder's note count when move note from folder
|
||||
*/
|
||||
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
|
||||
"CREATE TRIGGER decrease_folder_count_on_update " +
|
||||
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
|
||||
" BEGIN " +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
|
||||
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
|
||||
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Increase folder's note count when insert new note to the folder
|
||||
*/
|
||||
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
|
||||
"CREATE TRIGGER increase_folder_count_on_insert " +
|
||||
" AFTER INSERT ON " + TABLE.NOTE +
|
||||
" BEGIN " +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
|
||||
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Decrease folder's note count when delete note from the folder
|
||||
*/
|
||||
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
|
||||
"CREATE TRIGGER decrease_folder_count_on_delete " +
|
||||
" AFTER DELETE ON " + TABLE.NOTE +
|
||||
" BEGIN " +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
|
||||
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
|
||||
" AND " + NoteColumns.NOTES_COUNT + ">0;" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Update note's content when insert data with type {@link DataConstants#NOTE}
|
||||
*/
|
||||
private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
|
||||
"CREATE TRIGGER update_note_content_on_insert " +
|
||||
" AFTER INSERT ON " + TABLE.DATA +
|
||||
" WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
|
||||
" BEGIN" +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
|
||||
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Update note's content when data with {@link DataConstants#NOTE} type has changed
|
||||
*/
|
||||
private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
|
||||
"CREATE TRIGGER update_note_content_on_update " +
|
||||
" AFTER UPDATE ON " + TABLE.DATA +
|
||||
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
|
||||
" BEGIN" +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
|
||||
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
|
||||
*/
|
||||
private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
|
||||
"CREATE TRIGGER update_note_content_on_delete " +
|
||||
" AFTER delete ON " + TABLE.DATA +
|
||||
" WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
|
||||
" BEGIN" +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.SNIPPET + "=''" +
|
||||
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Delete datas belong to note which has been deleted
|
||||
*/
|
||||
private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
|
||||
"CREATE TRIGGER delete_data_on_delete " +
|
||||
" AFTER DELETE ON " + TABLE.NOTE +
|
||||
" BEGIN" +
|
||||
" DELETE FROM " + TABLE.DATA +
|
||||
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Delete notes belong to folder which has been deleted
|
||||
*/
|
||||
private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
|
||||
"CREATE TRIGGER folder_delete_notes_on_delete " +
|
||||
" AFTER DELETE ON " + TABLE.NOTE +
|
||||
" BEGIN" +
|
||||
" DELETE FROM " + TABLE.NOTE +
|
||||
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
|
||||
" END";
|
||||
|
||||
/**
|
||||
* Move notes belong to folder which has been moved to trash folder
|
||||
*/
|
||||
private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
|
||||
"CREATE TRIGGER folder_move_notes_on_trash " +
|
||||
" AFTER UPDATE ON " + TABLE.NOTE +
|
||||
" WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
|
||||
" BEGIN" +
|
||||
" UPDATE " + TABLE.NOTE +
|
||||
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
|
||||
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
|
||||
" END";
|
||||
|
||||
public NotesDatabaseHelper(Context context) {
|
||||
super(context, DB_NAME, null, DB_VERSION);
|
||||
}
|
||||
|
||||
public void createNoteTable(SQLiteDatabase db) {
|
||||
db.execSQL(CREATE_NOTE_TABLE_SQL);
|
||||
reCreateNoteTableTriggers(db);
|
||||
createSystemFolder(db);
|
||||
Log.d(TAG, "note table has been created");
|
||||
}
|
||||
|
||||
private void reCreateNoteTableTriggers(SQLiteDatabase db) {
|
||||
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash");
|
||||
|
||||
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
|
||||
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
|
||||
db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);
|
||||
db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);
|
||||
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
|
||||
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
|
||||
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
|
||||
}
|
||||
|
||||
private void createSystemFolder(SQLiteDatabase db) {
|
||||
ContentValues values = new ContentValues();
|
||||
|
||||
/**
|
||||
* call record foler for call notes
|
||||
*/
|
||||
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
|
||||
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
||||
db.insert(TABLE.NOTE, null, values);
|
||||
|
||||
/**
|
||||
* root folder which is default folder
|
||||
*/
|
||||
values.clear();
|
||||
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
|
||||
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
||||
db.insert(TABLE.NOTE, null, values);
|
||||
|
||||
/**
|
||||
* temporary folder which is used for moving note
|
||||
*/
|
||||
values.clear();
|
||||
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
|
||||
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
||||
db.insert(TABLE.NOTE, null, values);
|
||||
|
||||
/**
|
||||
* create trash folder
|
||||
*/
|
||||
values.clear();
|
||||
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
|
||||
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
||||
db.insert(TABLE.NOTE, null, values);
|
||||
}
|
||||
|
||||
public void createDataTable(SQLiteDatabase db) {
|
||||
db.execSQL(CREATE_DATA_TABLE_SQL);
|
||||
reCreateDataTableTriggers(db);
|
||||
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
|
||||
Log.d(TAG, "data table has been created");
|
||||
}
|
||||
|
||||
private void reCreateDataTableTriggers(SQLiteDatabase db) {
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete");
|
||||
|
||||
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
|
||||
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
|
||||
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
|
||||
}
|
||||
|
||||
static synchronized NotesDatabaseHelper getInstance(Context context) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new NotesDatabaseHelper(context);
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(SQLiteDatabase db) {
|
||||
createNoteTable(db);
|
||||
createDataTable(db);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||
boolean reCreateTriggers = false;
|
||||
boolean skipV2 = false;
|
||||
|
||||
if (oldVersion == 1) {
|
||||
upgradeToV2(db);
|
||||
skipV2 = true; // this upgrade including the upgrade from v2 to v3
|
||||
oldVersion++;
|
||||
}
|
||||
|
||||
if (oldVersion == 2 && !skipV2) {
|
||||
upgradeToV3(db);
|
||||
reCreateTriggers = true;
|
||||
oldVersion++;
|
||||
}
|
||||
|
||||
if (oldVersion == 3) {
|
||||
upgradeToV4(db);
|
||||
oldVersion++;
|
||||
}
|
||||
if(oldVersion == 4){
|
||||
upgradeToV5(db);
|
||||
oldVersion++;
|
||||
}
|
||||
|
||||
if (reCreateTriggers) {
|
||||
reCreateNoteTableTriggers(db);
|
||||
reCreateDataTableTriggers(db);
|
||||
}
|
||||
|
||||
if (oldVersion != newVersion) {
|
||||
throw new IllegalStateException("Upgrade notes database to version " + newVersion
|
||||
+ "fails");
|
||||
}
|
||||
}
|
||||
|
||||
private void upgradeToV2(SQLiteDatabase db) {
|
||||
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);
|
||||
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);
|
||||
createNoteTable(db);
|
||||
createDataTable(db);
|
||||
}
|
||||
|
||||
private void upgradeToV3(SQLiteDatabase db) {
|
||||
// drop unused triggers
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete");
|
||||
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update");
|
||||
// add a column for gtask id
|
||||
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
|
||||
+ " TEXT NOT NULL DEFAULT ''");
|
||||
// add a trash system folder
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
|
||||
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
|
||||
db.insert(TABLE.NOTE, null, values);
|
||||
}
|
||||
|
||||
private void upgradeToV4(SQLiteDatabase db) {
|
||||
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
|
||||
+ " INTEGER NOT NULL DEFAULT 0");
|
||||
}
|
||||
private void upgradeToV5(SQLiteDatabase db){
|
||||
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.PASSWORD
|
||||
+ " TEXT DEFAULT NULL ");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package net.micode.notes.gtask.remote;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
|
||||
import net.micode.notes.R;
|
||||
import net.micode.notes.ui.NotesListActivity;
|
||||
import net.micode.notes.ui.NotesPreferenceActivity;
|
||||
|
||||
|
||||
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
|
||||
|
||||
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
|
||||
|
||||
public interface OnCompleteListener {
|
||||
void onComplete();
|
||||
}
|
||||
|
||||
private Context mContext;
|
||||
|
||||
private NotificationManager mNotifiManager;
|
||||
|
||||
private GTaskManager mTaskManager;
|
||||
|
||||
private OnCompleteListener mOnCompleteListener;
|
||||
|
||||
public GTaskASyncTask(Context context, OnCompleteListener listener) {
|
||||
mContext = context;
|
||||
mOnCompleteListener = listener;
|
||||
mNotifiManager = (NotificationManager) mContext
|
||||
.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mTaskManager = GTaskManager.getInstance();
|
||||
}
|
||||
|
||||
public void cancelSync() {
|
||||
mTaskManager.cancelSync();
|
||||
}
|
||||
|
||||
public void publishProgess(String message) {
|
||||
publishProgress(new String[] {
|
||||
message
|
||||
});
|
||||
}
|
||||
|
||||
private void showNotification(int tickerId, String content) {
|
||||
Notification notification = new Notification(R.drawable.notification, mContext
|
||||
.getString(tickerId), System.currentTimeMillis());
|
||||
notification.defaults = Notification.DEFAULT_LIGHTS;
|
||||
notification.flags = Notification.FLAG_AUTO_CANCEL;
|
||||
PendingIntent pendingIntent;
|
||||
if (tickerId != R.string.ticker_success) {
|
||||
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
||||
NotesPreferenceActivity.class), 0);
|
||||
|
||||
} else {
|
||||
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
||||
NotesListActivity.class), 0);
|
||||
}
|
||||
// notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
|
||||
// pendingIntent);
|
||||
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Integer doInBackground(Void... unused) {
|
||||
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
|
||||
.getSyncAccountName(mContext)));
|
||||
return mTaskManager.sync(mContext, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onProgressUpdate(String... progress) {
|
||||
showNotification(R.string.ticker_syncing, progress[0]);
|
||||
if (mContext instanceof GTaskSyncService) {
|
||||
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Integer result) {
|
||||
if (result == GTaskManager.STATE_SUCCESS) {
|
||||
showNotification(R.string.ticker_success, mContext.getString(
|
||||
R.string.success_sync_account, mTaskManager.getSyncAccount()));
|
||||
NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
|
||||
} else if (result == GTaskManager.STATE_NETWORK_ERROR) {
|
||||
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
|
||||
} else if (result == GTaskManager.STATE_INTERNAL_ERROR) {
|
||||
showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
|
||||
} else if (result == GTaskManager.STATE_SYNC_CANCELLED) {
|
||||
showNotification(R.string.ticker_cancel, mContext
|
||||
.getString(R.string.error_sync_cancelled));
|
||||
}
|
||||
if (mOnCompleteListener != null) {
|
||||
new Thread(new Runnable() {
|
||||
|
||||
public void run() {
|
||||
mOnCompleteListener.onComplete();
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
package net.micode.notes.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.SearchManager;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.ContentUris;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Paint;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.text.style.BackgroundColorSpan;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.micode.notes.R;
|
||||
import net.micode.notes.data.Notes;
|
||||
import net.micode.notes.data.Notes.TextNote;
|
||||
import net.micode.notes.model.WorkingNote;
|
||||
import net.micode.notes.model.WorkingNote.NoteSettingChangedListener;
|
||||
import net.micode.notes.tool.DataUtils;
|
||||
import net.micode.notes.tool.ResourceParser;
|
||||
import net.micode.notes.tool.ResourceParser.TextAppearanceResources;
|
||||
import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener;
|
||||
import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
|
||||
import net.micode.notes.widget.NoteWidgetProvider_2x;
|
||||
import net.micode.notes.widget.NoteWidgetProvider_4x;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class ChangeLoginPasswordActivity extends Activity {
|
||||
EditText OldPassword;
|
||||
EditText NewPassword;
|
||||
EditText ReWritePassword;
|
||||
Button Acknowledged;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
setContentView(R.layout.change_login_password_activity);
|
||||
getWindow().setSoftInputMode(
|
||||
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
|
||||
| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
|
||||
OldPassword=(EditText) findViewById(R.id.old_password);
|
||||
NewPassword=(EditText) findViewById(R.id.new_password);
|
||||
ReWritePassword=(EditText) findViewById(R.id.ack_password);
|
||||
Acknowledged=(Button)findViewById(R.id.Bt_Acknowledged);
|
||||
Acknowledged.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
String old_password = OldPassword.getText().toString();
|
||||
String new_password = NewPassword.getText().toString();
|
||||
String ack_password = ReWritePassword.getText().toString();
|
||||
|
||||
SharedPreferences pref=getSharedPreferences("user management",MODE_PRIVATE);
|
||||
|
||||
String login_password=pref.getString("password","");
|
||||
|
||||
if(old_password.equals("")==true || new_password.equals("")==true || ack_password.equals("")==true) {
|
||||
Toast.makeText(ChangeLoginPasswordActivity.this, "密码不能为空", Toast.LENGTH_SHORT).show();
|
||||
}else if (new_password.equals(ack_password) == false) {
|
||||
Toast.makeText(ChangeLoginPasswordActivity.this, "新建密码与重复密码不匹配,请重新输入密码", Toast.LENGTH_SHORT).show();
|
||||
ReWritePassword.setText("");
|
||||
}else if(old_password.equals(login_password) == false){
|
||||
Toast.makeText(ChangeLoginPasswordActivity.this, "原有密码错误,请重新输入密码", Toast.LENGTH_SHORT).show();
|
||||
OldPassword.setText("");
|
||||
}
|
||||
else if (new_password.equals(ack_password) == true && old_password.equals(login_password) == true){
|
||||
SharedPreferences.Editor editor=getSharedPreferences("user management", MODE_PRIVATE).edit();
|
||||
editor.putString("password",new_password);
|
||||
editor.apply();
|
||||
Toast.makeText(ChangeLoginPasswordActivity.this, "修改密码成功", Toast.LENGTH_SHORT).show();
|
||||
Intent intent=new Intent(ChangeLoginPasswordActivity.this, LoginActivity.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
Intent intent=new Intent(ChangeLoginPasswordActivity.this, LoginActivity.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,76 @@
|
||||
package net.micode.notes.ui;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.SearchManager;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.ContentUris;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Paint;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableString;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateUtils;
|
||||
import android.text.style.BackgroundColorSpan;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import net.micode.notes.R;
|
||||
import net.micode.notes.data.Notes;
|
||||
import net.micode.notes.data.Notes.TextNote;
|
||||
import net.micode.notes.model.WorkingNote;
|
||||
import net.micode.notes.model.WorkingNote.NoteSettingChangedListener;
|
||||
import net.micode.notes.tool.DataUtils;
|
||||
import net.micode.notes.tool.ResourceParser;
|
||||
import net.micode.notes.tool.ResourceParser.TextAppearanceResources;
|
||||
import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener;
|
||||
import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
|
||||
import net.micode.notes.widget.NoteWidgetProvider_2x;
|
||||
import net.micode.notes.widget.NoteWidgetProvider_4x;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
||||
public class LoginView extends Activity
|
||||
{
|
||||
Handler mHandler=new Handler();
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.login_view);
|
||||
mHandler.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Intent intent = new Intent(LoginView.this, LoginActivity.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
},2000);
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 163 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 789 KiB |
After Width: | Height: | Size: 404 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 58 KiB |
@ -0,0 +1,72 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="输入原有密码:"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/old_password"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:password="true"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="输入新建密码:"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/new_password"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:password="true"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center">
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="再次输入密码:"/>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/ack_password"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:password="true"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center">
|
||||
|
||||
<Button
|
||||
android:id="@+id/Bt_Acknowledged"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="确认"/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.LoginActivity"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp"
|
||||
android:layout_gravity="center">
|
||||
<TextView
|
||||
android:layout_width="90dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:textSize="18sp"
|
||||
android:text="@string/prompt_account" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/account"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp"
|
||||
android:layout_gravity="center">
|
||||
|
||||
<TextView
|
||||
android:layout_width="90dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/prompt_password"
|
||||
android:textSize="18sp" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/password"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:inputType="textPassword" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="60dp"
|
||||
android:layout_gravity="center">
|
||||
|
||||
<Button
|
||||
android:id="@+id/login"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/prompt_login" />
|
||||
<Button
|
||||
android:id="@+id/cancel"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/cancel" />
|
||||
<Button
|
||||
android:id="@+id/change_password"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text='修改密码'/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/login_view_photo_2">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/login_view_text"
|
||||
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:keepScreenOn="true"
|
||||
android:text="快放假了家人们"
|
||||
android:textSize="50sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="#1CAC78"
|
||||
/>
|
||||
|
||||
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextText"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="182dp"
|
||||
android:layout_weight="@android:dimen/dialog_min_width_major"
|
||||
android:ems="20"
|
||||
android:gravity="center"
|
||||
android:inputType="text"
|
||||
android:text="选择你的模版"
|
||||
android:textSize="50sp"
|
||||
android:visibility="visible" />
|
||||
</LinearLayout>
|
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<EditText
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/set_password"
|
||||
android:layout_width="fill_parent"
|
||||
android:hint="@string/hint_foler_name"
|
||||
android:layout_height="fill_parent" />
|
||||
|