You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
xiaomi/tool/DataUtils.java

450 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.tool;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.OperationApplicationException;
import android.database.Cursor;
import android.os.RemoteException;
import android.util.Log;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.CallNote;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
import java.util.ArrayList;
import java.util.HashSet;
/**
* 该类提供了一系列用于操作笔记数据的工具方法,
* 涵盖了批量删除、移动笔记、查询文件夹和笔记信息等功能。
*/
public class DataUtils {
// 日志标签,方便在日志中识别与该类相关的信息
public static final String TAG = "DataUtils";
/**
* 批量删除指定ID集合中的笔记
*
* @param resolver 内容解析器,用于与内容提供者交互
* @param ids 要删除的笔记ID集合
* @return 删除操作是否成功若集合为空或操作成功返回true失败返回false
*/
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> ids) {
// 若传入的ID集合为null打印日志并返回true
if (ids == null) {
Log.d(TAG, "the ids is null");
return true;
}
// 若ID集合为空打印日志并返回true
if (ids.size() == 0) {
Log.d(TAG, "no id is in the hashset");
return true;
}
// 用于存储批量操作的列表
ArrayList<ContentProviderOperation> operationList = new ArrayList<>();
// 遍历ID集合
for (long id : ids) {
// 若ID为根文件夹ID打印错误日志并跳过此次循环
if (id == Notes.ID_ROOT_FOLDER) {
Log.e(TAG, "Don't delete system folder root");
continue;
}
// 创建一个删除操作的构建器
ContentProviderOperation.Builder builder = ContentProviderOperation
.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
// 将构建好的操作添加到操作列表中
operationList.add(builder.build());
}
try {
// 批量执行操作
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
// 若操作结果为空或长度为0或第一个结果为空打印日志并返回false
if (results == null || results.length == 0 || results[0] == null) {
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
return false;
}
return true;
} catch (RemoteException e) {
// 处理远程异常,打印错误日志
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
} catch (OperationApplicationException e) {
// 处理操作应用异常,打印错误日志
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
}
return false;
}
/**
* 将指定ID的笔记移动到目标文件夹
*
* @param resolver 内容解析器
* @param id 要移动的笔记ID
* @param srcFolderId 笔记当前所在的文件夹ID
* @param desFolderId 目标文件夹ID
*/
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
// 用于存储要更新的键值对
ContentValues values = new ContentValues();
// 设置笔记的父文件夹ID为目标文件夹ID
values.put(NoteColumns.PARENT_ID, desFolderId);
// 设置笔记的原始父文件夹ID为源文件夹ID
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);
// 标记笔记为本地修改
values.put(NoteColumns.LOCAL_MODIFIED, 1);
// 执行更新操作
resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);
}
/**
* 批量将指定ID集合中的笔记移动到目标文件夹
*
* @param resolver 内容解析器
* @param ids 要移动的笔记ID集合
* @param folderId 目标文件夹ID
* @return 移动操作是否成功
*/
public static boolean batchMoveToFolder(ContentResolver resolver, HashSet<Long> ids, long folderId) {
// 若传入的ID集合为null打印日志并返回true
if (ids == null) {
Log.d(TAG, "the ids is null");
return true;
}
// 用于存储批量操作的列表
ArrayList<ContentProviderOperation> operationList = new ArrayList<>();
// 遍历ID集合
for (long id : ids) {
// 创建一个更新操作的构建器
ContentProviderOperation.Builder builder = ContentProviderOperation
.newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
// 设置笔记的父文件夹ID为目标文件夹ID
builder.withValue(NoteColumns.PARENT_ID, folderId);
// 标记笔记为本地修改
builder.withValue(NoteColumns.LOCAL_MODIFIED, 1);
// 将构建好的操作添加到操作列表中
operationList.add(builder.build());
}
try {
// 批量执行操作
ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
// 若操作结果为空或长度为0或第一个结果为空打印日志并返回false
if (results == null || results.length == 0 || results[0] == null) {
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
return false;
}
return true;
} catch (RemoteException e) {
// 处理远程异常,打印错误日志
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
} catch (OperationApplicationException e) {
// 处理操作应用异常,打印错误日志
Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
}
return false;
}
/**
* 获取用户创建的文件夹数量(排除系统文件夹)
*
* @param resolver 内容解析器
* @return 用户文件夹的数量
*/
public static int getUserFolderCount(ContentResolver resolver) {
// 查询用户文件夹的数量
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
new String[]{"COUNT(*)"},
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?",
new String[]{String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)},
null);
int count = 0;
if (cursor != null) {
if (cursor.moveToFirst()) {
try {
// 获取查询结果中的计数
count = cursor.getInt(0);
} catch (IndexOutOfBoundsException e) {
// 处理索引越界异常,打印错误日志
Log.e(TAG, "get folder count failed:" + e.toString());
} finally {
// 关闭游标
cursor.close();
}
}
}
return count;
}
/**
* 检查指定笔记是否在数据库中可见
*
* @param resolver 内容解析器
* @param noteId 笔记ID
* @param type 笔记类型
* @return 笔记是否可见
*/
public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) {
// 查询指定笔记是否存在且不在回收站
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
null,
NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
new String[]{String.valueOf(type)},
null);
boolean exist = false;
if (cursor != null) {
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;
}
/**
* 检查指定笔记是否存在于数据库中
*
* @param resolver 内容解析器
* @param noteId 笔记ID
* @return 笔记是否存在
*/
public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) {
// 查询指定笔记是否存在
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
null, null, null, null);
boolean exist = false;
if (cursor != null) {
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;
}
/**
* 检查指定数据是否存在于数据库中
*
* @param resolver 内容解析器
* @param dataId 数据ID
* @return 数据是否存在
*/
public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
// 查询指定数据是否存在
Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),
null, null, null, null);
boolean exist = false;
if (cursor != null) {
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;
}
/**
* 检查指定名称的可见文件夹是否存在于数据库中
*
* @param resolver 内容解析器
* @param name 文件夹名称
* @return 文件夹是否存在
*/
public static boolean checkVisibleFolderName(ContentResolver resolver, String name) {
// 查询指定名称的可见文件夹是否存在
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null,
NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER +
" AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER +
" AND " + NoteColumns.SNIPPET + "=?",
new String[]{name}, null);
boolean exist = false;
if (cursor != null) {
if (cursor.getCount() > 0) {
exist = true;
}
// 关闭游标
cursor.close();
}
return exist;
}
/**
* 获取指定文件夹下的笔记小部件属性集合
*
* @param resolver 内容解析器
* @param folderId 文件夹ID
* @return 笔记小部件属性集合
*/
public static HashSet<AppWidgetAttribute> getFolderNoteWidget(ContentResolver resolver, long folderId) {
// 查询指定文件夹下的笔记小部件信息
Cursor c = resolver.query(Notes.CONTENT_NOTE_URI,
new String[]{NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE},
NoteColumns.PARENT_ID + "=?",
new String[]{String.valueOf(folderId)},
null);
HashSet<AppWidgetAttribute> set = null;
if (c != null) {
if (c.moveToFirst()) {
set = new HashSet<>();
do {
try {
// 创建小部件属性对象
AppWidgetAttribute widget = new AppWidgetAttribute();
// 设置小部件ID
widget.widgetId = c.getInt(0);
// 设置小部件类型
widget.widgetType = c.getInt(1);
// 将小部件属性添加到集合中
set.add(widget);
} catch (IndexOutOfBoundsException e) {
// 处理索引越界异常,打印错误日志
Log.e(TAG, e.toString());
}
} while (c.moveToNext());
}
// 关闭游标
c.close();
}
return set;
}
/**
* 根据笔记ID获取通话号码
*
* @param resolver 内容解析器
* @param noteId 笔记ID
* @return 通话号码,如果未找到则返回空字符串
*/
public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {
// 查询指定笔记ID对应的通话号码
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
new String[]{CallNote.PHONE_NUMBER},
CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?",
new String[]{String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE},
null);
if (cursor != null && cursor.moveToFirst()) {
try {
// 获取通话号码
return cursor.getString(0);
} catch (IndexOutOfBoundsException e) {
// 处理索引越界异常,打印错误日志
Log.e(TAG, "Get call number fails " + e.toString());
} finally {
// 关闭游标
cursor.close();
}
}
return "";
}
/**
* 根据电话号码和通话日期获取笔记ID
*
* @param resolver 内容解析器
* @param phoneNumber 电话号码
* @param callDate 通话日期
* @return 笔记ID如果未找到则返回0
*/
public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
// 查询指定电话号码和通话日期对应的笔记ID
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
new String[]{CallNote.NOTE_ID},
CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL("
+ CallNote.PHONE_NUMBER + ",?)",
new String[]{String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber},
null);
if (cursor != null) {
if (cursor.moveToFirst()) {
try {
// 获取笔记ID
return cursor.getLong(0);
} catch (IndexOutOfBoundsException e) {
// 处理索引越界异常,打印错误日志
Log.e(TAG, "Get call note id fails " + e.toString());
}
}
// 关闭游标
cursor.close();
}
return 0;
}
/**
* 根据笔记ID获取笔记摘要
*
* @param resolver 内容解析器
* @param noteId 笔记ID
* @return 笔记摘要,如果未找到则抛出异常
*/
public static String getSnippetById(ContentResolver resolver, long noteId) {
// 查询指定笔记ID对应的摘要
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
new String[]{NoteColumns.SNIPPET},
NoteColumns.ID + "=?",
new String[]{String.valueOf(noteId)},
null);
if (cursor != null) {
String snippet = "";
if (cursor.moveToFirst()) {
// 获取笔记摘要
snippet = cursor.getString(0);
}
// 关闭游标
cursor.close();
return snippet;
}
// 若未找到笔记,抛出异常
throw new IllegalArgumentException("Note is not found with id: " + noteId);
}
/**
* 格式化笔记摘要,去除首尾空格并截取第一行
*
* @param snippet 原始笔记摘要
* @return 格式化后的笔记摘要
*/
public static String getFormattedSnippet(String snippet) {
if (snippet != null) {
// 去除首尾空格
snippet = snippet.trim();
// 查找换行符位置
int index = snippet.indexOf('\n');
if (index != -1) {
// 截取第一行
snippet = snippet.substring(0, index);
}
}
return snippet;
}
}