Compare commits

..

9 Commits

@ -0,0 +1,94 @@
/*
* 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;
// 定义了该类所属的包名表明这个类在net.micode.notes.data这个包下方便在项目中进行组织和管理代码
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Data;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import java.util.HashMap;
// 导入了必要的Android相关类以及Java的HashMap类用于后续操作中获取上下文、操作数据库游标、访问联系人相关数据、处理电话号码格式以及进行日志记录、缓存数据存储等
public class Contact {
// 定义名为Contact的公共类用于处理联系人相关的操作
private static HashMap<String, String> sContactCache;
// 定义一个静态的HashMap用于缓存已经查询过的电话号码对应的联系人姓名避免重复查询数据库提高性能
private static final String TAG = "Contact";
// 定义一个静态的常量字符串,用于作为日志输出的标签,方便在日志中识别是该类输出的相关信息
private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER
+ ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'"
+ " AND " + Data.RAW_CONTACT_ID + " IN "
+ "(SELECT raw_contact_id "
+ " FROM phone_lookup"
+ " WHERE min_match = '+')";
// 定义一个静态的常量字符串它是一个用于查询联系人数据库的SQL语句的条件部分WHERE子句内容用于根据电话号码查找匹配的联系人相关记录这里构造了一个比较复杂的条件涉及电话号码匹配、数据类型匹配以及原始联系人ID的筛选等条件
public static String getContact(Context context, String phoneNumber) {
// 定义一个静态的公共方法用于根据给定的上下文和电话号码获取对应的联系人姓名接受一个Context对象用于获取系统服务等操作和一个电话号码字符串作为参数
if (sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
// 如果联系人缓存sContactCache为空就创建一个新的HashMap实例用于后续缓存联系人姓名和电话号码的对应关系
if (sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 如果缓存中已经包含了当前要查询的电话号码对应的联系人姓名,直接从缓存中获取并返回该姓名,避免重复查询数据库
String selection = CALLER_ID_SELECTION.replace("+",
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
// 根据传入的电话号码替换之前定义的查询条件CALLER_ID_SELECTION中的占位符这里是'+'通过PhoneNumberUtils工具类将电话号码转换为合适的格式用于查询匹配生成最终的查询条件字符串
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
new String[]{Phone.DISPLAY_NAME},
selection,
new String[]{phoneNumber},
null);
// 使用传入的上下文context获取ContentResolver对象通过它来执行数据库查询操作查询的是联系人数据相关的Content URIData.CONTENT_URI指定要查询的列是联系人的显示姓名Phone.DISPLAY_NAME传入前面生成的查询条件selection以及要查询的电话号码参数phoneNumber最后一个参数为null表示不使用排序等额外条件
if (cursor!= null && cursor.moveToFirst()) {
// 如果查询返回的游标cursor不为空并且游标可以移动到第一条记录表示有查询到匹配的数据
try {
String name = cursor.getString(0);
// 从游标中获取第一条记录的第一列数据这里对应前面指定查询的联系人显示姓名那一列并赋值给name变量
sContactCache.put(phoneNumber, name);
// 将查询到的电话号码和对应的联系人姓名存入缓存sContactCache方便下次查询相同电话号码时直接使用缓存数据
return name;
// 返回查询到的联系人姓名
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, " Cursor get string error " + e.toString());
return null;
} finally {
cursor.close();
}
// 如果在获取游标数据时出现越界异常IndexOutOfBoundsException记录错误日志日志标签为前面定义的TAG内容包含具体的异常信息然后返回null无论是否出现异常最终都会关闭游标释放相关资源
} else {
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
// 如果游标为空或者游标无法移动到第一条记录即没有查询到匹配的联系人数据记录一条调试日志Log.d说明没有匹配到对应电话号码的联系人然后返回null表示没有查询到对应的联系人姓名
}
}

@ -0,0 +1,135 @@
/*
* 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.
*/
// 版权声明部分表明该代码遵循Apache License 2.0开源协议,包含版权归属、授权相关等信息,说明了代码的使用规则和限制等情况。
package net.micode.notes.ui;
// 声明该类所在的包名,用于对代码进行组织和模块化管理,方便在项目中引用和区分不同功能模块的类,使代码结构更清晰。
import java.util.Calendar;
// 导入Calendar类用于处理日期和时间相关操作比如获取当前时间、设置具体的年月日时分秒等信息在这里用于存储和操作用户选择的日期时间数据。
import net.micode.notes.R;
import net.micode.notes.ui.DateTimePicker;
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
// 导入应用内自定义的资源类R用于访问项目中的各种资源如图标、布局、样式等以及与日期时间选择相关的DateTimePicker类和其内部定义的用于监听日期时间变化的接口OnDateTimeChangedListener说明该对话框会依赖DateTimePicker来实现日期时间选择的功能并监听其变化进行相应处理。
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
// 导入必要的Android系统类
// - AlertDialog用于创建弹出式的警告对话框这里继承自它来构建一个特定的日期时间选择对话框。
// - Context用于获取应用程序的上下文环境以便访问系统资源、服务等在初始化对话框以及设置相关文本资源等操作中会用到。
// - DialogInterface.OnClickListener用于定义对话框中按钮点击事件的监听器接口实现该接口可以处理按钮点击后的逻辑这里用于处理对话框中确定按钮点击后的操作。
// - DateFormat用于处理日期时间格式相关的判断比如判断当前系统是否采用24小时制显示时间等情况。
// - DateUtils用于对日期时间进行格式化等实用操作例如按照指定的格式将日期时间转换为字符串等功能在这里用于设置对话框标题显示的日期时间格式。
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
// 定义一个名为DateTimePickerDialog的类继承自AlertDialog类表示这是一个自定义的对话框同时实现了OnClickListener接口用于处理对话框内按钮点击的相关逻辑。
private Calendar mDate = Calendar.getInstance();
// 定义一个私有成员变量mDate类型为Calendar通过调用Calendar.getInstance()获取当前的日期时间实例,用于存储用户在日期时间选择器中选择或者初始设置的日期时间信息,后续可以方便地对其进行各种日期时间相关的操作,如获取具体的年、月、日、时、分等信息。
private boolean mIs24HourView;
// 定义一个私有成员变量mIs24HourView类型为布尔值用于记录当前是否采用24小时制来显示时间后续根据这个值来决定在对话框标题等地方显示时间的格式。
private OnDateTimeSetListener mOnDateTimeSetListener;
// 定义一个私有成员变量mOnDateTimeSetListener类型为自定义的接口OnDateTimeSetListener用于在用户完成日期时间选择并点击确定按钮后回调外部定义的方法将选择的日期时间信息传递出去方便外部进行相应的业务处理。
private DateTimePicker mDateTimePicker;
// 定义一个私有成员变量mDateTimePicker类型为DateTimePicker这是一个自定义的日期时间选择器组件应该是在应用内自定义实现的用于在对话框中展示给用户进行日期时间的选择操作。
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
// 在类内部定义一个公共的接口OnDateTimeSetListener该接口定义了一个方法OnDateTimeSet接收AlertDialog类型的对话框对象以及表示日期时间的长整型通常是时间戳形式参数要求实现该接口的类需要实现这个方法以便在用户完成日期时间选择后将相关信息传递回调用处进行后续处理。
public DateTimePickerDialog(Context context, long date) {
// 定义类的构造函数接收一个Context上下文对象和一个表示初始日期时间的长整型参数date用于创建日期时间选择对话框实例并进行相关的初始化设置。
super(context);
// 调用父类AlertDialog的构造函数传入上下文对象确保父类的初始化逻辑得以执行这是继承关系中构造函数的常规调用方式以保证对话框的基本属性和功能能够正常初始化。
mDateTimePicker = new DateTimePicker(context);
// 创建一个新的DateTimePicker实例传入上下文对象用于在对话框中展示日期时间选择的界面让用户能够进行具体的选择操作。
setView(mDateTimePicker);
// 将创建好的DateTimePicker实例设置为对话框的显示内容即将日期时间选择器添加到对话框中使其成为对话框的主体显示部分用户通过操作这个选择器来选择日期时间。
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
// 为mDateTimePicker设置日期时间变化的监听器通过创建一个实现了OnDateTimeChangedListener接口的匿名内部类实例来实现当用户在日期时间选择器中改变了日期时间的选择时会触发以下的onDateTimeChanged方法。
public void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month);
mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
mDate.set(Calendar.MINUTE, minute);
updateTitle(mDate.getTimeInMillis());
// 在监听器的方法中首先将用户选择的具体年、月、日、时、分等信息设置到mDateCalendar实例以更新存储的日期时间数据然后调用updateTitle方法根据更新后的日期时间来更新对话框的标题使其实时显示当前选择的日期时间。
}
});
mDate.setTimeInMillis(date);
mDate.set(Calendar.SECOND, 0);
// 根据传入的初始日期时间参数date通过调用mDateCalendar实例的setTimeInMillis方法将其设置为初始的日期时间然后将秒数设置为0可能是为了将选择的时间精度统一到分钟级别或者按照业务需求对初始时间进行标准化处理。
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
// 将日期时间选择器的当前显示日期时间设置为刚才初始化好的mDate所代表的日期时间使得选择器初始显示的时间就是传入的初始时间或者经过处理后的初始时间方便用户基于此进行后续的调整选择。
setButton(context.getString(R.string.datetime_dialog_ok), this);
// 通过调用父类AlertDialog的setButton方法设置对话框的“确定”按钮传入从资源类R中获取的表示“确定”按钮文本的字符串资源作为按钮显示文本并将当前类因为实现了OnClickListener接口作为按钮点击事件的监听器这样当用户点击“确定”按钮时会触发当前类中实现的onClick方法来处理相关逻辑。
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
// 通过调用父类AlertDialog的setButton2方法设置对话框的“取消”按钮传入从资源类R中获取的表示“取消”按钮文本的字符串资源作为按钮显示文本并传入null作为按钮点击事件的监听器意味着点击“取消”按钮时不做额外的逻辑处理直接关闭对话框默认行为
set24HourView(DateFormat.is24HourFormat(this.getContext()));
// 调用set24HourView方法根据当前系统是否采用24小时制显示时间通过调用DateFormat.is24HourFormat方法并传入当前上下文对象来判断来设置mIs24HourView变量的值以确定后续时间显示的格式。
updateTitle(mDate.getTimeInMillis());
// 最后再次调用updateTitle方法根据当前设置好的mDate中的日期时间信息来更新对话框的标题确保标题显示的日期时间是准确的初始状态或者经过设置后的状态。
}
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
// 定义一个公共方法用于设置是否采用24小时制显示时间接收一个布尔值参数is24HourView将其赋值给mIs24HourView成员变量以便在后续更新时间显示格式等操作中使用这个设置值。
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
// 定义一个公共方法用于设置日期时间选择完成后的回调监听器接收一个实现了OnDateTimeSetListener接口的对象作为参数callBack将其赋值给mOnDateTimeSetListener成员变量这样在用户点击“确定”按钮后就可以通过这个回调将选择的日期时间信息传递给外部的监听器对象进行相应处理。
private void updateTitle(long date) {
int flag =
DateUtils.FORMAT_SHOW_YEAR |
DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_TIME;
flag |= mIs24HourView? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_12HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
// 定义一个私有方法用于更新对话框的标题显示内容根据传入的表示日期时间的长整型参数date来进行格式化并设置标题。
// 首先设置一个整型变量flag通过位运算组合了多个用于控制日期时间显示格式的常量这些常量定义在DateUtils类中分别表示要显示年份、日期、时间等信息然后根据mIs24HourView的值是否采用24小时制来决定添加对应的24小时制或12小时制显示格式的标志最后调用DateUtils的formatDateTime方法传入当前上下文对象、日期时间参数date以及格式化标志flag将格式化后的日期时间字符串设置为对话框的标题内容使得标题能够按照设定的格式准确显示当前选择的日期时间。
}
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener!= null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
// 实现OnClickListener接口的onClick方法用于处理对话框中按钮点击的逻辑这里主要处理“确定”按钮点击事件。
// 首先判断mOnDateTimeSetListener是否为空如果不为空表示已经设置了日期时间选择完成后的回调监听器那么就调用其OnDateTimeSet方法传入当前对话框对象this以及mDate所代表的日期时间通过getTimeInMillis方法获取时间戳形式的日期时间值将用户选择的日期时间信息传递给外部实现了OnDateTimeSetListener接口的对象进行相应的业务处理。
}
}
}

@ -0,0 +1,166 @@
/*
* 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.
*/
// 版权声明部分说明代码遵循Apache License 2.0开源协议,以及相关的版权归属、授权说明等信息
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;
// 导入相关的Android系统类以及应用内自定义的类用于后续操作中使用这些类的功能
// 例如Notification相关类用于创建和管理通知AsyncTask用于异步任务处理等R类用于获取资源相关的引用等
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
// 定义一个名为GTaskASyncTask的类继承自AsyncTask用于执行异步任务
// 泛型参数分别表示:
// - Void表示异步任务执行时不需要传入参数
// - String表示在任务执行过程中可以传递进度信息的类型这里是字符串形式的进度信息
// - Integer表示异步任务执行完成后返回结果的类型
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
// 定义一个静态的整型变量,用于作为同步任务相关通知的唯一标识符
public interface OnCompleteListener {
void onComplete();
}
// 定义一个内部接口OnCompleteListener用于定义任务完成后的回调方法具体实现由外部类决定
private Context mContext;
// 保存上下文对象,用于后续获取系统服务、资源等操作
private NotificationManager mNotifiManager;
// 用于管理通知的显示、取消等操作的对象
private GTaskManager mTaskManager;
// 与GTask相关的管理类对象可能用于执行具体的同步等任务逻辑
private OnCompleteListener mOnCompleteListener;
// 保存任务完成监听器对象,用于在任务结束后执行相应的回调逻辑
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context;
mOnCompleteListener = listener;
mNotifiManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
mTaskManager = GTaskManager.getInstance();
}
// 构造函数,接收上下文对象和任务完成监听器
// 在构造函数中:
// - 初始化成员变量mContext和mOnCompleteListener
// - 通过上下文获取系统的通知管理服务赋值给mNotifiManager
// - 获取GTaskManager的单例实例赋值给mTaskManager
public void cancelSync() {
mTaskManager.cancelSync();
}
// 定义一个方法用于取消同步任务实际调用的是GTaskManager中的取消同步方法
public void publishProgess(String message) {
publishProgress(new String[] {
message
});
}
// 对外提供的方法用于发布任务进度信息实际是调用父类AsyncTask的publishProgress方法
// 将传入的单个字符串消息包装成字符串数组后传递给publishProgress方法
private void showNotification(int tickerId, String content) {
PendingIntent pendingIntent;
if (tickerId!= R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE);
} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
}
// 根据传入的tickerId判断要启动的目标Activity创建对应的PendingIntent
// 如果不是表示成功的tickerId就创建启动NotesPreferenceActivity的PendingIntent否则创建启动NotesListActivity的PendingIntent
Notification.Builder builder = new Notification.Builder(mContext)
.setAutoCancel(true)
.setContentTitle(mContext.getString(R.string.app_name))
.setContentText(content)
.setContentIntent(pendingIntent)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
// 创建一个Notification.Builder对象用于构建通知
// 设置通知的相关属性如自动取消、标题使用应用名称资源字符串、内容、关联的PendingIntent、触发时间以及设置为正在进行状态
Notification notification = builder.getNotification();
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
// 从构建器获取最终的通知对象,并通过通知管理对象根据通知标识符来显示通知
}
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext)));
return mTaskManager.sync(mContext, this);
}
// 重写AsyncTask的doInBackground方法在异步任务执行的后台线程中
// - 首先发布一个表示登录同步进度的消息,消息内容通过格式化资源字符串并传入同步账户名获取
// - 然后调用GTaskManager的sync方法执行同步任务并返回同步结果返回类型为Integer
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
// 重写AsyncTask的onProgressUpdate方法当在后台线程中调用publishProgress方法发布进度时会触发该方法
// - 首先根据固定的表示正在同步的tickerId和传入的进度消息内容来显示通知
// - 然后判断上下文是否是GTaskSyncService类型如果是则发送包含进度消息的广播
@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));
}
// 根据异步任务执行完成后的结果result来显示不同类型的通知
// - 如果是成功状态,显示成功相关的通知,并记录最后同步时间到偏好设置中
// - 如果是网络错误状态,显示网络错误相关通知
// - 如果是内部错误状态,显示内部错误相关通知
// - 如果是同步取消状态,显示同步取消相关通知
if (mOnCompleteListener!= null) {
new Thread(new Runnable() {
public void run() {
mOnCompleteListener.onComplete();
}
}).start();
}
// 如果任务完成监听器不为空则创建一个新线程来执行监听器的onComplete方法确保在合适的线程环境下执行回调逻辑
}
}

@ -0,0 +1,142 @@
/*
* 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.
*/
// 版权声明部分表明该代码遵循Apache License 2.0开源协议,包含版权归属、授权相关等信息,说明了代码的使用规则和限制等情况。
package net.micode.notes.tool;
// 声明该类所在的包名,用于对代码进行组织和模块化管理,方便在项目中引用和区分不同功能模块的类,使代码结构更清晰。
public class GTaskStringUtils {
// 定义一个名为GTaskStringUtils的公共类从类名推测可能是用于处理与GTask相关的字符串操作的工具类通常会包含一些静态的常量字符串成员方便在代码中统一使用和引用。
public final static String GTASK_JSON_ACTION_ID = "action_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中动作action的唯一标识符对应的键Key名称方便在解析或构建JSON数据时通过这个键来获取或设置相应的值。
public final static String GTASK_JSON_ACTION_LIST = "action_list";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中动作列表action_list对应的键Key名称可能用于存放多个动作相关信息的集合在处理JSON数据交互时可依据此键来操作对应的数据内容。
public final static String GTASK_JSON_ACTION_TYPE = "action_type";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中动作类型action_type对应的键Key名称通过这个键对应的值可以判断具体执行的是哪种类型的动作比如创建、更新等操作便于在代码中根据不同动作类型进行相应的逻辑处理。
public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中创建create类型动作对应的具体值当通过GTASK_JSON_ACTION_TYPE这个键获取到的值为此常量时可确定当前动作是创建操作便于在业务逻辑中识别和处理创建相关的任务或数据。
public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中获取全部get_all类型动作对应的具体值用于在解析JSON数据时判断是否是获取所有相关数据的操作请求以便执行相应的获取全部数据的逻辑处理。
public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中移动move类型动作对应的具体值当在JSON数据中识别到此值作为动作类型时可知道要执行的是移动相关的数据操作比如移动任务到其他位置等情况。
public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中更新update类型动作对应的具体值用于判断JSON数据中对应的动作是更新操作进而执行相应的更新任务、数据等业务逻辑。
public final static String GTASK_JSON_CREATOR_ID = "creator_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中创建者creator的唯一标识符对应的键Key名称可通过这个键获取到创建对应数据如任务、列表等的用户的标识信息用于权限管理、记录创建源头等用途。
public final static String GTASK_JSON_CHILD_ENTITY = "child_entity";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中子实体child_entity对应的键Key名称可能在表示具有层级关系的数据结构中用于标识某个实体的子级相关的内容便于在处理JSON数据时操作和获取对应的子实体信息。
public final static String GTASK_JSON_CLIENT_VERSION = "client_version";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中客户端版本client_version对应的键Key名称可通过这个键获取到客户端使用的软件版本信息用于版本兼容性判断、数据格式适配等相关逻辑处理。
public final static String GTASK_JSON_COMPLETED = "completed";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中完成状态completed对应的键Key名称其对应的值可能用于表示某个任务、操作等是否已经完成方便在业务逻辑中根据完成情况进行后续处理比如展示已完成任务列表等。
public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中当前列表current_list的唯一标识符对应的键Key名称用于获取当前正在操作或显示的列表的标识信息比如在任务列表切换等场景下确定当前所处的列表。
public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中默认列表default_list的唯一标识符对应的键Key名称可通过这个键获取到默认的列表标识常用于在一些初始化、默认显示等场景下确定要展示的默认列表内容。
public final static String GTASK_JSON_DELETED = "deleted";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中删除状态deleted对应的键Key名称其对应的值可用于判断某个数据如任务、列表等是否已经被删除便于在数据处理和展示中过滤掉已删除的内容。
public final static String GTASK_JSON_DEST_LIST = "dest_list";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中目标列表dest_list对应的键Key名称在涉及移动、复制等操作时用于标识操作的目标列表位置方便在业务逻辑中确定数据要移动或复制到的目标位置。
public final static String GTASK_JSON_DEST_PARENT = "dest_parent";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中目标父级dest_parent对应的键Key名称当处理具有层级关系的数据移动、关联等操作时用于指定目标位置的父级相关信息辅助确定准确的目标位置。
public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中目标父级类型dest_parent_type对应的键Key名称可通过这个键获取到目标父级的类型信息比如是哪种类型的分组、列表等有助于在复杂的数据结构操作中进行类型判断和相应的逻辑处理。
public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中实体增量entity_delta对应的键Key名称可能用于记录某个实体相对于之前状态的变化量、差异信息等在数据更新、同步等场景下可依据此键来处理实体的变化情况。
public final static String GTASK_JSON_ENTITY_TYPE = "entity_type";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中实体类型entity_type对应的键Key名称通过这个键获取到的值可以判断实体是任务、列表还是其他类型的数据便于在代码中针对不同类型的实体执行相应的处理逻辑。
public final static String GTASK_JSON_GET_DELETED = "get_deleted";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中获取已删除数据get_deleted对应的键Key名称可能用于在某些查询操作中明确要获取的是已经被删除的数据相关信息便于数据恢复、历史记录查看等功能的实现。
public final static String GTASK_JSON_ID = "id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中通用的唯一标识符id对应的键Key名称几乎所有的实体如任务、列表、用户等都可能有对应的唯一标识通过这个键可以方便地获取和操作它们的标识信息用于数据关联、查找等操作。
public final static String GTASK_JSON_INDEX = "index";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中索引index对应的键Key名称可用于表示某个元素在列表、数组等结构中的位置顺序信息在排序、查找特定位置元素等操作中会用到这个键对应的索引值。
public final static String GTASK_JSON_LAST_MODIFIED = "last_modified";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中最后修改时间last_modified对应的键Key名称通过这个键获取到的值可以知道对应的数据如任务、列表等最后一次被修改的时间常用于数据同步、版本控制等场景下判断数据的新旧程度。
public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中最新同步点latest_sync_point对应的键Key名称可能用于记录与服务器或者其他数据源进行数据同步时的最新时间点、版本等关键信息便于后续进行增量同步等操作判断同步的起始位置。
public final static String GTASK_JSON_LIST_ID = "list_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中列表list的唯一标识符对应的键Key名称用于获取和操作特定列表的标识信息比如在任务与列表关联、切换列表显示等场景下使用这个键来确定相关的列表。
public final static String GTASK_JSON_LISTS = "lists";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中列表lists复数形式可能表示多个列表的集合对应的键Key名称可通过这个键获取到包含多个列表信息的数据内容常用于获取所有列表、展示列表集合等操作场景。
public final static String GTASK_JSON_NAME = "name";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中名称name对应的键Key名称可用于获取各种实体如任务、列表、用户等的名称信息方便在界面展示、数据筛选等操作中使用。
public final static String GTASK_JSON_NEW_ID = "new_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中新的唯一标识符new_id对应的键Key名称可能在创建新的实体、复制实体等操作后用于获取新生成的标识信息便于后续对新实体进行关联、操作等处理。
public final static String GTASK_JSON_NOTES = "notes";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中备注notes复数形式可能表示多条备注信息对应的键Key名称可通过这个键获取到与某个实体相关的备注内容常用于添加、查看任务等相关的详细说明信息场景。
public final static String GTASK_JSON_PARENT_ID = "parent_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中父级parent的唯一标识符对应的键Key名称用于获取某个实体所属的父级的标识信息在处理层级结构的数据关系时通过这个键可以明确父子层级关联便于进行数据的查找、移动等操作。
public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中前一个兄弟节点prior_sibling的唯一标识符对应的键Key名称在处理具有顺序关系的同层级元素如任务列表中的任务顺序通过这个键可以获取到当前元素前一个兄弟元素的标识信息有助于进行排序、插入等操作。
public final static String GTASK_JSON_RESULTS = "results";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中结果results对应的键Key名称可能用于存放某个操作如查询、执行任务等完成后返回的结果数据集合方便在业务逻辑中获取和处理操作得到的最终结果内容。
public final static String GTASK_JSON_SOURCE_LIST = "source_list";
// 定义一个公共的、 static的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中源列表source_list对应的键Key名称在涉及移动、复制等操作时用于标识操作的起始列表位置与dest_list相对应明确数据的来源和去向。
public final static String GTASK_JSON_TASKS = "tasks";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中任务tasks复数形式可能表示多个任务的集合对应的键Key名称可通过这个键获取到包含多个任务信息的数据内容常用于展示任务列表、处理任务集合等操作场景。
public final static String GTASK_JSON_TYPE = "type";
// 定义一个公共的、静态的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中类型type对应的键Key名称通过这个键获取到的值可以判断数据是何种类型比如是任务类型还是列表类型等便于在代码中针对不同类型的数据进行分类处理。
public final static String GTASK_JSON_TYPE_GROUP = "GROUP";
// 定义一个公共的、 static的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中GROUP类型对应的具体值当通过GTASK_JSON_TYPE这个键获取到的值为此常量时可确定当前数据是组类型方便在业务逻辑中对组相关的数据进行特定的处理操作。
public final static String GTASK_JSON_TYPE_TASK = "TASK";
// 定义一个公共的、 static的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中任务TASK类型对应的具体值用于判断JSON数据中对应的实体是任务类型进而执行相应的任务相关业务逻辑。
public final static String GTASK_JSON_USER = "user";
// 定义一个公共的、 static的、不可变final的字符串常量用于表示在与GTask相关的JSON数据结构中用户user对应的键Key名称可通过这个键获取到与用户相关的信息比如用户名、用户标识等用于用户权限管理、关联用户操作等场景。
public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]";
// 定义一个公共的、 static的、不可变final的字符串常量看起来是与MIUI系统下的笔记应用相关的文件夹前缀可能用于标识特定的笔记文件夹方便在文件系统或者数据存储中区分出属于该应用的相关文件夹内容。
public final static String FOLDER_DEFAULT = "Default";
// 定义一个公共的、 static

@ -0,0 +1,194 @@
/*
* 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.
*/
// 版权声明部分表明该代码遵循Apache License 2.0开源协议,包含版权所属、授权相关说明等信息
package net.micode.notes.gtask.remote;
// 声明该类所属的包名,用于对代码进行合理的组织和模块化管理,方便在项目中引用和区分不同功能模块的类
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
// 导入必要的Android系统类
// - Activity用于与Android应用中的界面相关操作尽管此处主要是服务类但在启动服务等相关操作中会涉及
// - Service是当前类继承的基类用于定义后台服务相关逻辑
// - Context提供了访问应用环境全局信息的入口可用于获取系统服务等操作
// - Intent用于在组件间启动、切换以及传递数据比如启动该服务并传递相关参数
// - Bundle用于在Intent中以键值对的形式携带额外的数据
// - IBinder用于服务绑定相关的操作此处实现的服务不需要绑定操作返回null即可
public class GTaskSyncService extends Service {
// 定义名为GTaskSyncService的类继承自Android的Service类意味着它将作为一个后台服务在Android系统中运行可执行一些长时间运行的操作且没有可视化的用户界面
public final static String ACTION_STRING_NAME = "sync_action_type";
// 定义一个公共的、静态的字符串常量用作在Intent传递的额外数据Extras区分不同同步操作类型的键Key通过这个键对应的值来判断要执行的具体同步相关动作
public final static int ACTION_START_SYNC = 0;
// 定义一个公共的、静态的整型常量代表启动同步操作的动作类型值当在Intent的Extras中通过ACTION_STRING_NAME这个键对应的值为此常量时表示要执行启动同步任务的操作
public final static int ACTION_CANCEL_SYNC = 1;
// 定义一个公共的、静态的整型常量代表取消同步操作的动作类型值用于在Intent传递数据中标识请求取消正在进行的同步任务的操作
public final static int ACTION_INVALID = 2;
// 定义一个公共的、静态的整型常量用于表示无效的动作类型值通常在解析Intent中传递的动作类型时如果得到的值不符合预期的有效动作类型如不是上述定义的启动或取消等可用于判断当前操作类型是无效的情况
public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
// 定义一个公共的、静态的字符串常量作为广播的动作Action用于唯一标识该服务发送的广播消息其他组件可以通过注册监听这个动作的广播接收器来接收该服务发送的相关广播内容
public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
// 定义一个公共的、静态的字符串常量作为广播中传递的表示是否正在同步的键对应的值为布尔类型用于在广播Intent中向其他组件传达当前是否有同步任务正在进行的状态信息
public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
// 定义一个公共的、静态的字符串常量作为广播中传递同步进度消息的键对应的值为字符串类型用于在广播Intent中向其他组件发送同步任务当前的进度相关文字信息
private static GTaskASyncTask mSyncTask = null;
// 定义一个静态的私有成员变量用于保存正在进行的GTaskASyncTask实例初始化为null表示当前没有正在执行的同步任务通过它可以方便地控制同步任务的执行、取消等操作并判断是否有任务正在进行
private static String mSyncProgress = "";
// 定义一个静态的私有成员变量,用于保存同步任务的进度消息,初始化为空字符串,后续可通过相关方法更新其内容,并在广播等操作中传递出去,告知其他组件同步任务的进展情况
private void startSync() {
// 定义一个私有方法,用于启动同步任务
if (mSyncTask == null) {
// 判断当前是否已经有正在执行的同步任务如果没有mSyncTask为null则执行以下操作来启动新的同步任务
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
// 创建一个新的GTaskASyncTask实例传入当前服务的上下文this指向GTaskSyncService实例以及一个实现了OnCompleteListener接口的匿名内部类实例
public void onComplete() {
// 实现OnCompleteListener接口的onComplete方法当同步任务完成时会被调用
mSyncTask = null;
// 将mSyncTask置为null表示同步任务已结束释放对之前任务实例的引用
sendBroadcast("");
// 发送一个空消息的广播,可能用于通知其他组件同步任务已完成,其他组件可以通过监听对应的广播动作来接收并处理这个完成事件
stopSelf();
// 停止当前服务自身,因为同步任务已经完成,服务的主要工作已结束,不再需要继续运行
}
});
sendBroadcast("");
// 在启动任务前先发送一个空消息的广播,可能用于告知其他组件即将开始同步任务,其他组件可以根据广播做出相应的准备或显示相关提示等操作
mSyncTask.execute();
// 调用GTaskASyncTask实例的execute方法开始在后台线程执行同步任务该方法会触发GTaskASyncTask中定义的异步任务相关逻辑如在后台执行具体的同步操作并通过回调等方式更新进度和返回结果
}
}
private void cancelSync() {
// 定义一个私有方法,用于取消正在进行的同步任务
if (mSyncTask!= null) {
// 判断当前是否有正在执行的同步任务mSyncTask不为null如果有则执行取消操作
mSyncTask.cancelSync();
// 调用GTaskASyncTask实例的cancelSync方法该方法内部应该实现了取消正在进行的同步任务的具体逻辑比如中断相关线程、清理资源等操作以停止同步任务的继续执行
}
}
@Override
public void onCreate() {
// 重写Service类的onCreate方法该方法在服务第一次被创建时调用用于进行一些初始化操作
mSyncTask = null;
// 将mSyncTask置为null确保每次服务创建时都初始化为没有正在执行的同步任务状态可能是为了防止之前残留的任务实例影响本次服务运行的状态
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 重写Service类的onStartCommand方法该方法在每次通过startService方法启动服务时被调用用于处理启动服务时传入的Intent以及决定服务后续的行为如重启策略等
Bundle bundle = intent.getExtras();
// 从传入的Intent中获取携带的额外数据以Bundle形式存在这些额外数据可以包含启动服务时需要传递的参数例如同步操作类型等信息
if (bundle!= null && bundle.containsKey(ACTION_STRING_NAME)) {
// 判断获取到的Bundle是否不为空并且其中包含了以ACTION_STRING_NAME为键的数据即判断是否有传递同步操作类型相关的参数
switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {
// 根据通过ACTION_STRING_NAME获取到的整数值如果获取失败则使用默认的ACTION_INVALID值进行不同情况的分支处理
case ACTION_START_SYNC:
startSync();
break;
// 如果获取到的值是ACTION_START_SYNC表示要启动同步任务调用startSync方法来启动同步任务
case ACTION_CANCEL_SYNC:
cancelSync();
break;
// 如果获取到的值是ACTION_CANCEL_SYNC表示要取消同步任务调用cancelSync方法来取消正在进行的同步任务
default:
break;
// 如果获取到的值是其他不匹配的情况比如ACTION_INVALID等则不做任何操作直接跳过
}
return START_STICKY;
// 返回START_STICKY表示服务在被异常终止如系统内存不足等情况会尝试重新启动并且会再次调用onStartCommand方法传入上一次的Intent来恢复服务的运行以保证服务的持续可用性常用于需要持续运行的后台服务场景
}
return super.onStartCommand(intent, flags, startId);
// 如果传入的Intent中没有包含有效的同步操作类型参数则调用父类Service类的onStartCommand方法按照默认的行为处理启动服务的请求
}
@Override
public void onLowMemory() {
// 重写Service类的onLowMemory方法该方法在系统内存不足可能会回收服务所在进程的内存时被调用用于释放服务占用的一些不必要的资源等操作
if (mSyncTask!= null) {
// 判断当前是否有正在执行的同步任务mSyncTask不为null如果有则执行取消操作以释放相关资源避免因内存不足导致系统出现异常等情况
mSyncTask.cancelSync();
}
}
public IBinder onBind(Intent intent) {
// 重写Service类的onBind方法用于处理服务绑定的相关逻辑当其他组件通过bindService方法尝试绑定该服务时会调用此方法
return null;
// 在此处返回null表示该服务不支持绑定操作即其他组件不能通过绑定的方式与该服务进行交互通常适用于只需要通过启动startService方式使用的服务场景
}
public void sendBroadcast(String msg) {
// 定义一个公共方法,用于发送广播消息,将服务内部的相关状态信息(如同步进度等)传递给其他注册了相应广播接收器的组件
mSyncProgress = msg;
// 将传入的消息字符串赋值给mSyncProgress成员变量更新同步进度消息内容以便后续在广播中传递出去
Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
// 创建一个新的Intent对象设置其动作Action为之前定义的GTASK_SERVICE_BROADCAST_NAME用于标识该广播是由本服务发出的其他组件通过监听这个动作来接收该广播
intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask!= null);
// 在Intent中添加额外数据以GTASK_SERVICE_BROADCAST_IS_SYNCING为键将当前是否有同步任务正在进行通过判断mSyncTask是否为null的布尔值作为对应的值添加进去以便其他组件可以获取到同步任务的运行状态信息
intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
// 在Intent中再添加额外数据以GTASK_SERVICE_BROADCAST_PROGRESS_MSG为键将当前的同步进度消息即之前更新的mSyncProgress变量的值作为对应的值添加进去这样其他组件就能接收到同步任务的进度情况了
sendBroadcast(intent);
// 通过调用系统的sendBroadcast方法发送创建好的包含相关信息的Intent广播使得注册了对应广播动作的其他组件能够接收到这个广播并进行相应的处理
}
public static void startSync(Activity activity) {
// 定义一个公共的静态方法用于从外部比如Activity中方便地启动该服务的同步任务
GTaskManager.getInstance().setActivityContext(activity);
// 通过GTaskManager的单例实例调用其setActivityContext方法将传入的Activity实例传递进去可能是为了让GTaskManager在后续的同步操作中能够获取到与界面相关的上下文信息比如用于更新UI等操作具体取决于GTaskManager的实现逻辑
Intent intent = new Intent(activity, GTaskSyncService.class);
// 创建一个新的Intent对象指定要启动的组件为当前的GTaskSyncService类即启动本服务并且以传入的Activity作为上下文来启动这样可以在Activity的环境下启动服务并传递相关数据等
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
// 在创建的Intent中添加额外数据以ACTION_STRING_NAME为键将ACTION_START_SYNC作为对应的值添加进去表示这次启动服务的意图是要执行启动同步任务的操作
activity.startService(intent);
// 通过传入的Activity实例调用startService方法正式启动该服务服务启动后会根据传入的Intent中的参数在其onStartCommand方法中进行相应的同步任务启动等操作
}
public static void cancelSync(Context context) {
// 定义一个公共的静态方法用于从外部通过传入的任意有效的Context上下文方便地取消该服务正在进行的同步任务
Intent intent = new Intent(context, GTaskSyncService.class);
// 创建一个新的Intent对象指定要操作的目标服务为当前的GTaskSyncService类使用传入的Context上下文来创建Intent以便在相应的环境下启动服务并传递数据
intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);
// 在创建的Intent中添加额外数据以ACTION_STRING_NAME为键将ACTION_CANCEL_SYNC作为对应的值添加进去表示这次启动服务的意图是要执行取消同步任务的操作
context.startService(intent);
// 通过传入的Context实例调用startService方法向服务发送取消同步任务的请求服务接收到请求后会在其onStartCommand方法中根据传入的参数调用相应的取消同步任务的逻辑如调用cancelSync方法
}
public static boolean isSyncing() {
// 定义一个公共的静态方法,用于外部组件方便地查询当前服务是否有同步任务正在进行
return mSyncTask!= null;
// 通过判断mSyncTask是否为null来返回一个布尔值表示是否有同步任务正在执行外部组件可以根据这个返回值来决定是否显示同步相关的提示信息等操作
}
public static String getProgressString() {
// 定义一个公共的静态方法,用于外部组件获取当前服务的同步任务进度消息
return mSyncProgress;
// 直接返回mSyncProgress成员变量的值即当前的同步进度消息字符串外部组件可以获取并显示这个消息以告知用户同步任务的进展情况
}
}

@ -0,0 +1,102 @@
/*
* 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.
*/
// 版权声明部分说明了代码的版权归属、遵循的Apache License 2.0开源协议以及协议获取的链接等信息
package net.micode.notes.gtask.data;
// 定义该类所属的包名表明这个类在net.micode.notes.gtask.data这个包下便于在项目中对代码进行组织和管理
import android.database.Cursor;
import android.util.Log;
import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
// 导入了必要的Android相关类用于操作数据库游标和日志记录、自定义的工具类GTaskStringUtils可能用于处理和Google Tasks相关的字符串操作以及JSON相关的类用于处理JSON数据的解析、构建等操作
public class MetaData extends Task {
// 定义一个名为MetaData的公共类它继承自Task类表明MetaData类具有Task类的所有属性和方法并且可以在此基础上进行扩展或重写从类名推测可能用于处理和任务相关的元数据
private final static String TAG = MetaData.class.getSimpleName();
// 定义一个私有静态的最终字符串常量其值为MetaData类的简单名称通常用于作为日志输出的标签方便在日志中识别是该类相关的操作记录
private String mRelatedGid = null;
// 定义一个私有字符串变量用于存储和该元数据相关的Google Tasks的ID从变量名推测初始值设为null
public void setMeta(String gid, JSONObject metaInfo) {
// 定义一个公共方法用于设置元数据相关信息接受一个字符串类型的Google Tasks IDgid和一个JSONObject类型的元数据信息metaInfo作为参数
try {
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
// 尝试将传入的Google Tasks IDgid添加到传入的JSON对象metaInfo键为GTaskStringUtils.META_HEAD_GTASK_ID可能是在GTaskStringUtils类中定义的用于表示Google Tasks ID的常量如果添加过程中出现JSON格式相关的异常则会进入catch块处理
} catch (JSONException e) {
Log.e(TAG, "failed to put related gid");
// 如果在向JSON对象中添加数据时出现异常使用Log.e记录错误日志日志标签为前面定义的TAG日志内容表示添加相关Google Tasks ID失败并输出异常信息
}
setNotes(metaInfo.toString());
// 将处理后的JSON对象转换为字符串并调用从父类继承的setNotes方法推测是用于设置相关的备注信息之类的功能具体要看Task类的定义将转换后的字符串作为参数传入
setName(GTaskStringUtils.META_NOTE_NAME);
// 调用从父类继承的setName方法推测是用于设置名称相关的功能传入GTaskStringUtils.META_NOTE_NAME可能是在GTaskStringUtils类中定义的表示元数据备注名称的常量作为参数设置该元数据对应的名称
}
public String getRelatedGid() {
return mRelatedGid;
}
// 定义一个公共方法用于获取之前存储的和该元数据相关的Google Tasks IDmRelatedGid直接返回该变量的值
@Override
public boolean isWorthSaving() {
return getNotes()!= null;
}
// 重写了父类Task类中的isWorthSaving方法用于判断该元数据是否值得保存这里的逻辑是通过调用从父类继承的getNotes方法获取相关备注信息之类的内容如果获取到的内容不为null则认为是值得保存的返回true否则返回false
@Override
public void setContentByRemoteJSON(JSONObject js) {
// 重写父类Task类中的setContentByRemoteJSON方法用于根据远程传来的JSON对象设置相关内容
super.setContentByRemoteJSON(js);
// 先调用父类的setContentByRemoteJSON方法执行父类中原本的设置逻辑确保父类相关的初始化等操作得以执行
if (getNotes()!= null) {
// 如果通过从父类继承的getNotes方法获取到的备注信息不为null
try {
JSONObject metaInfo = new JSONObject(getNotes().trim());
// 尝试将获取到的备注信息字符串去除首尾空白字符后转换为一个新的JSONObject对象以便后续从中获取数据
mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
// 从新创建的JSONObject对象中获取名为GTaskStringUtils.META_HEAD_GTASK_ID前面提到的表示Google Tasks ID的键对应的字符串值并赋值给mRelatedGid变量用于更新该元数据关联的Google Tasks ID
} catch (JSONException e) {
Log.w(TAG, "failed to get related gid");
mRelatedGid = null;
}
// 如果在从JSON对象中获取字符串值时出现异常使用Log.w记录警告日志日志标签为TAG日志内容表示获取相关Google Tasks ID失败然后将mRelatedGid重新设置为null以保证数据的一致性
}
}
@Override
public void setContentByLocalJSON(JSONObject js) {
// 重写父类Task类中的setContentByLocalJSON方法但是这里直接抛出异常表示这个方法不应该被调用
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
@Override
public JSONObject getLocalJSONFromContent() {
// 重写父类Task类中的getLocalJSONFromContent方法同样直接抛出异常表示这个方法不应该被调用
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
@Override
public int getSyncAction(Cursor c) {
// 重写父类Task类中的getSyncAction方法也是直接抛出异常表示这个方法不应该被调用
throw new IllegalAccessError("MetaData:getSyncAction should not be called");
}
}

@ -0,0 +1,114 @@
/*
* 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.
*/
// 版权声明部分说明了代码的版权归属、遵循的Apache License 2.0开源协议以及协议获取的链接等信息
package net.micode.notes.gtask.data;
// 定义该类所属的包名表明这个类在net.micode.notes.gtask.data这个包下便于在项目中对代码进行组织和管理
import android.database.Cursor;
import org.json.JSONObject;
// 导入了必要的类其中Cursor用于操作数据库游标以便后续可能从数据库获取数据等操作JSONObject用于处理JSON格式的数据可能在与外部交互或者存储数据时会使用到JSON格式
public abstract class Node {
// 定义一个抽象类Node抽象类意味着它不能被直接实例化通常是作为其他具体类的基类为子类定义一些通用的属性和方法规范
public static final int SYNC_ACTION_NONE = 0;
// 定义一个公共静态的最终整型常量用于表示同步操作中的无操作情况可能在判断同步状态等场景下使用值为0
public static final int SYNC_ACTION_ADD_REMOTE = 1;
// 定义一个公共静态的最终整型常量用于表示向远程添加数据的同步操作类型值为1
public static final int SYNC_ACTION_ADD_LOCAL = 2;
// 定义一个公共静态的最终整型常量用于表示在本地添加数据的同步操作类型值为2
public static final int SYNC_ACTION_DEL_REMOTE = 3;
// 定义一个公共静态的最终整型常量用于表示从远程删除数据的同步操作类型值为3
public static final int SYNC_ACTION_DEL_LOCAL = 4;
// 定义一个公共静态的最终整型常量用于表示在本地删除数据的同步操作类型值为4
public static final int SYNC_ACTION_UPDATE_REMOTE = 5;
// 定义一个公共静态的最终整型常量用于表示远程数据更新的同步操作类型值为5
public static final int SYNC_ACTION_UPDATE_LOCAL = 6;
// 定义一个公共静态的最终整型常量用于表示本地数据更新的同步操作类型值为6
public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;
// 定义一个公共静态的最终整型常量用于表示更新数据时出现冲突的同步操作类型值为7
public static final int SYNC_ACTION_ERROR = 8;
// 定义一个公共静态的最终整型常量用于表示同步操作出现错误的情况值为8这些常量整体用于清晰地标识各种同步相关的操作状态
private String mGid;
// 定义一个私有字符串变量从变量名推测可能用于存储全局唯一标识符Global Identifier可能和数据的唯一标识等相关初始值未给定
private String mName;
// 定义一个私有字符串变量,用于存储节点的名称,初始值未给定
private long mLastModified;
// 定义一个私有长整型变量用于存储节点最后一次被修改的时间戳之类的数据初始值为0
private boolean mDeleted;
// 定义一个私有布尔型变量用于表示节点是否已被删除的状态初始值为false
public Node() {
// 定义Node类的默认构造函数用于初始化类中的各个成员变量
mGid = null;
// 将mGid初始化为null表示初始时全局唯一标识符为空
mName = "";
// 将mName初始化为空字符串表示初始时节点名称为空字符串
mLastModified = 0;
// 将mLastModified重新赋值为0明确初始化最后修改时间为0
mDeleted = false;
// 将mDeleted赋值为false明确初始化节点的删除状态为未删除
}
public abstract JSONObject getCreateAction(int actionId);
// 定义一个抽象方法要求子类必须实现该方法用于根据给定的操作IDactionId获取创建操作对应的JSON对象具体的创建操作逻辑由子类根据自身需求来实现返回的JSONObject应该包含创建相关的必要信息
public abstract JSONObject getUpdateAction(int actionId);
// 定义一个抽象方法要求子类必须实现该方法用于根据给定的操作IDactionId获取更新操作对应的JSON对象同样具体的更新操作逻辑由子类来定制返回的JSONObject会包含更新相关的数据等内容
public abstract void setContentByRemoteJSON(JSONObject js);
// 定义一个抽象方法子类必须实现用于根据传入的远程JSON对象js来设置节点的相关内容意味着子类要根据自身的数据结构和需求从JSON对象中解析并设置相应的属性值等
public abstract void setContentByLocalJSON(JSONObject js);
// 定义一个抽象方法子类要实现用于根据传入的本地JSON对象js来设置节点的相关内容和前面设置远程JSON内容类似只是数据源是本地的JSON数据
public abstract JSONObject getLocalJSONFromContent();
// 定义一个抽象方法子类需实现用于从节点的当前内容中获取对应的本地JSON对象即把节点内部的相关属性等信息转换为JSON格式的数据对象返回
public abstract int getSyncAction(Cursor c);
// 定义一个抽象方法子类必须实现用于根据传入的数据库游标c获取当前节点对应的同步操作类型子类需要根据游标所指向的数据等情况来判断并返回合适的同步操作类型前面定义的那些同步操作常量之一
public void setGid(String gid) {
this.mGid = gid;
}
// 定义一个公共方法用于设置节点的全局唯一标识符mGid接受一个字符串类型的参数gid并将其赋值给mGid变量
public void setName(String name) {
this.mName = name;
}
// 定义一个公共方法用于设置节点的名称mName接受一个字符串类型的参数name并将其赋值给mName变量
public void setLastModified(long lastModified) {
this.mLastModified = lastModified;
}
// 定义一个公共方法用于设置节点的最后修改时间mLastModified接受一个长整型参数lastModified并将其赋值给mLastModified变量
public void setDeleted(boolean deleted) {
this.mDeleted = deleted;
}
// 定义一个公共方法用于设置节点的删除状态mDeleted接受一个布尔型参数deleted将其赋值给mDeleted变量以更新节点是否已被删除的标识
public String getGid() {
return this.mGid;
}
// 定义一个公共方法用于获取节点的全局唯一标识符mGid直接返回mGid变量的值
public String getName() {
return this.mName;
}
// 定义一个公共方法用于获取节点的名称mName直接返回mName变量的值
public long getLastModified() {
return this.mLastModified;
}
// 定义一个公共方法用于获取节点的最后修改时间mLastModified直接返回mLastModified变量的值
public boolean getDeleted() {
return this.mDeleted;
}
// 定义一个公共方法用于获取节点的删除状态mDeleted直接返回mDeleted变量的值
}

@ -0,0 +1,226 @@
/*
* 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.
*/
// 版权声明部分表明该代码遵循Apache License 2.0开源协议,包含版权归属、授权相关等信息,说明了代码的使用规则和限制等情况。
package net.micode.notes.tool;
// 声明该类所在的包名,用于对代码进行组织和模块化管理,方便在项目中引用和区分不同功能模块的类,使代码结构更清晰。
import android.content.Context;
import android.preference.PreferenceManager;
// 导入必要的Android系统类
// - Context用于获取应用程序的上下文环境以便访问系统资源、服务等。
// - PreferenceManager用于方便地管理应用程序的偏好设置Shared Preferences例如获取默认的偏好设置对象等操作。
import net.micode.notes.R;
import net.micode.notes.ui.NotesPreferenceActivity;
// 导入应用内自定义的资源类R用于访问项目中的各种资源如图标、布局、样式等以及与笔记偏好设置相关的Activity类可能在获取特定偏好设置项等操作中会用到。
public class ResourceParser {
// 定义一个名为ResourceParser的公共类从类名推测它可能是用于解析各种资源相关信息的工具类比如根据不同条件获取对应的资源ID等操作。
public static final int YELLOW = 0;
public static final int BLUE = 1;
public static final int WHITE = 2;
public static final int GREEN = 3;
public static final int RED = 4;
// 定义一系列公共的、静态的、不可变final的整型常量用于表示不同的颜色选项通过整数索引的方式来区分不同颜色方便在代码中统一引用和进行逻辑判断这里以数字顺序分别对应不同颜色具体含义可能与笔记应用中的背景颜色等相关设置有关。
public static final int BG_DEFAULT_COLOR = YELLOW;
// 定义一个公共的、静态的、不可变final的整型常量用于表示默认的背景颜色其值被设置为之前定义的YELLOW意味着默认情况下背景颜色可能采用黄色在没有其他特殊设置的情况下会以此为准。
public static final int TEXT_SMALL = 0;
public static final int TEXT_MEDIUM = 1;
public static final int TEXT_LARGE = 2;
public static final int TEXT_SUPER = 3;
// 定义一系列公共的、静态的、不可变final的整型常量用于表示不同的文本字号大小选项同样以整数索引形式来区分不同字号便于在代码中进行相关文本字号设置等逻辑处理。
public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM;
// 定义一个公共的、静态的、不可变final的整型常量用于表示默认的字体大小其值被设置为之前定义的TEXT_MEDIUM即默认情况下文本字号可能采用中等大小在没有其他针对字体大小的特殊设置时以此为默认值。
public static class NoteBgResources {
// 定义一个内部静态类NoteBgResources从类名可以推测它主要用于处理笔记相关的背景资源相关操作比如获取不同情况下的背景图片资源ID等。
private final static int [] BG_EDIT_RESOURCES = new int [] {
R.drawable.edit_yellow,
R.drawable.edit_blue,
R.drawable.edit_white,
R.drawable.edit_green,
R.drawable.edit_red
};
// 定义一个私有静态的整型数组用于存储笔记编辑界面背景相关的资源ID数组中的每个元素对应一种颜色与前面定义的颜色常量顺序相关的编辑界面背景图片资源通过索引可以获取到相应颜色的背景图片资源ID方便后续在需要设置编辑界面背景时使用。
private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] {
R.drawable.edit_title_yellow,
R.drawable.edit_title_blue,
R.drawable.edit_title_white,
R.drawable.edit_title_green,
R.drawable.edit_title_red
};
// 定义一个私有静态的整型数组用于存储笔记编辑界面标题背景相关的资源ID同样按照颜色顺序排列每个元素对应一种颜色的编辑界面标题背景图片资源便于在设置标题背景时通过索引获取相应资源ID。
public static int getNoteBgResource(int id) {
return BG_EDIT_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引对应前面定义的颜色索引获取笔记编辑界面背景图片资源ID通过直接返回BG_EDIT_RESOURCES数组中对应索引位置的元素来实现方便外部代码获取指定颜色的编辑界面背景资源。
public static int getNoteTitleBgResource(int id) {
return BG_EDIT_TITLE_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取笔记编辑界面标题背景图片资源ID原理与getNoteBgResource方法类似只是从BG_EDIT_TITLE_RESOURCES数组中获取相应元素用于获取指定颜色的编辑界面标题背景资源。
}
public static int getDefaultBgId(Context context) {
// 定义一个公共静态方法用于获取默认的背景图片资源ID该方法接收一个Context对象作为参数以便访问应用的偏好设置等信息来确定默认背景。
if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) {
// 通过PreferenceManager获取默认的偏好设置对象并根据一个名为NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY的键应该在NotesPreferenceActivity类中定义用于标识是否设置了自定义背景颜色的偏好设置项获取对应的布尔值。
// 如果该布尔值为true表示用户已经设置了自定义的背景颜色执行以下逻辑
return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length);
// 通过生成一个随机数范围是0到NoteBgResources.BG_EDIT_RESOURCES数组长度减1之间作为索引从NoteBgResources.BG_EDIT_RESOURCES数组中随机获取一个背景图片资源ID实现随机选择一种颜色的背景图片作为默认背景在用户已设置自定义背景颜色的情况下
} else {
// 如果获取到的布尔值为false表示用户没有设置自定义背景颜色执行以下逻辑
return BG_DEFAULT_COLOR;
// 直接返回之前定义的默认背景颜色常量BG_DEFAULT_COLOR即黄色对应的索引值表示采用默认的背景颜色设置。
}
}
public static class NoteItemBgResources {
// 定义一个内部静态类NoteItemBgResources推测它主要用于处理笔记列表项相关的背景资源操作比如获取不同位置、不同状态下笔记列表项的背景图片资源ID等。
private final static int [] BG_FIRST_RESOURCES = new int [] {
R.drawable.list_yellow_up,
R.drawable.list_blue_up,
R.drawable.list_white_up,
R.drawable.list_green_up,
R.drawable.list_red_up
};
// 定义一个私有静态的整型数组用于存储笔记列表项处于首位时不同颜色对应的背景图片资源ID每个元素对应一种颜色的首位列表项背景图片资源方便在列表项首位显示时获取相应的背景资源。
private final static int [] BG_NORMAL_RESOURCES = new int [] {
R.drawable.list_yellow_middle,
R.drawable.list_blue_middle,
R.drawable.list_white_middle,
R.drawable.list_green_middle,
R.drawable.list_red_middle
};
// 定义一个私有静态的整型数组用于存储笔记列表项处于中间位置时不同颜色对应的背景图片资源ID每个元素对应一种颜色的中间位置列表项背景图片资源用于列表项非首位和末位时的背景显示资源获取。
private final static int [] BG_LAST_RESOURCES = new int [] {
R.drawable.list_yellow_down,
R.drawable.list_blue_down,
R.drawable.list_white_down,
R.drawable.list_green_down,
R.drawable.list_red_down,
};
// 定义一个私有静态的整型数组用于存储笔记列表项处于末位时不同颜色对应的背景图片资源ID每个元素对应一种颜色的末位列表项背景图片资源便于在列表项末尾显示时获取相应的背景资源。
private final static int [] BG_SINGLE_RESOURCES = new int [] {
R.drawable.list_yellow_single,
R.drawable.list_blue_single,
R.drawable.list_white_single,
R.drawable.list_green_single,
R.drawable.list_red_single
};
// 定义一个私有静态的整型数组用于存储当笔记列表项单独显示可能没有前后相邻项的情况时不同颜色对应的背景图片资源ID每个元素对应一种颜色的单独显示列表项背景图片资源用于特殊显示场景下的背景资源获取。
public static int getNoteBgFirstRes(int id) {
return BG_FIRST_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引对应颜色索引获取笔记列表项处于首位时的背景图片资源ID通过返回BG_FIRST_RESOURCES数组中对应索引位置的元素来实现方便外部代码在需要设置首位列表项背景时使用。
public static int getNoteBgLastRes(int id) {
return BG_LAST_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取笔记列表项处于末位时的背景图片资源ID原理与获取首位背景资源ID类似从BG_LAST_RESOURCES数组中获取对应元素用于设置末位列表项背景。
public static int getNoteBgSingleRes(int id) {
return BG_SINGLE_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取笔记列表项单独显示时的背景图片资源ID从BG_SINGLE_RESOURCES数组中获取对应元素用于单独显示列表项的背景设置。
public static int getNoteBgNormalRes(int id) {
return BG_NORMAL_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取笔记列表项处于中间位置时的背景图片资源ID从BG_NORMAL_RESOURCES数组中获取对应元素用于设置中间位置列表项的背景。
public static int getFolderBgRes() {
return R.drawable.list_folder;
}
// 定义一个公共静态方法用于获取文件夹相关的背景图片资源ID直接返回固定的R.drawable.list_folder这个资源ID用于在显示文件夹相关界面时设置背景图片资源。
}
public static class WidgetBgResources {
// 定义一个内部静态类WidgetBgResources推测它主要用于处理与应用小部件Widget相关的背景资源操作比如获取不同尺寸小部件的背景图片资源ID等。
private final static int [] BG_2X_RESOURCES = new int [] {
R.drawable.widget_2x_yellow,
R.drawable.widget_2x_blue,
R.drawable.widget_2x_white,
R.drawable.widget_2x_green,
R.drawable.widget_2x_red,
};
// 定义一个私有静态的整型数组用于存储2倍尺寸小部件不同颜色对应的背景图片资源ID每个元素对应一种颜色的2倍尺寸小部件背景图片资源方便在创建或显示2倍尺寸小部件时获取相应的背景资源。
public static int getWidget2xBgResource(int id) {
return BG_2X_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引对应颜色索引获取2倍尺寸小部件的背景图片资源ID通过返回BG_2X_RESOURCES数组中对应索引位置的元素来实现便于外部代码设置2倍尺寸小部件的背景。
private final static int [] BG_4X_RESOURCES = new int [] {
R.drawable.widget_4x_yellow,
R.drawable.widget_4x_blue,
R.drawable.widget_4x_white,
R.drawable.widget_4x_green,
R.drawable.widget_4x_red
};
// 定义一个私有静态的整型数组用于存储4倍尺寸小部件不同颜色对应的背景图片资源ID每个元素对应一种颜色的4倍尺寸小部件背景图片资源用于4倍尺寸小部件的背景资源获取。
public static int getWidget4xBgResource(int id) {
return BG_4X_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取4倍尺寸小部件的背景图片资源ID从BG_4X_RESOURCES数组中获取对应元素用于设置4倍尺寸小部件的背景。
}
public static class TextAppearanceResources {
// 定义一个内部静态类TextAppearanceResources推测它主要用于处理文本外观相关的资源操作比如获取不同字号对应的文本样式资源ID等。
private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] {
R.style.TextAppearanceNormal,
R.style.TextAppearanceMedium,
R.style.TextAppearanceLarge,
R.style.TextAppearanceSuper
};
// 定义一个私有静态的整型数组用于存储不同字号对应的文本外观样式资源ID每个元素对应一种字号大小的文本样式资源方便在设置文本外观时通过索引获取相应的样式资源ID。
public static int getTexAppearanceResource(int id) {
/**
* HACKME: Fix bug of store the resource id in shared preference.
* The id may larger than the length of resources, in this case,
* return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE}
*/
if (id >= TEXTAPPEARANCE_RESOURCES.length) {
return BG_DEFAULT_FONT_SIZE;
}
return TEXTAPPEARANCE_RESOURCES[id];
}
// 定义一个公共静态方法用于根据传入的整数索引获取文本外观样式资源ID首先会判断传入的索引是否大于TEXTAPPEARANCE_RESOURCES数组的长度可能是为了防止因存储的资源ID有误或者超出范围等情况导致的问题如果超出范围则返回之前定义的默认字体大小对应的资源IDBG_DEFAULT_FONT_SIZE否则返回TEXTAPPEARANCE_RESOURCES数组中对应索引位置的元素即正常获取相应字号对应的文本样式资源ID。
public static int getResourcesSize() {
return TEXTAPPEARANCE_RESOURCES.length;
}
// 定义一个公共静态方法用于获取TEXTAPPEARANCE_RESOURCES数组的长度也就是文本外观样式资源的数量方便外部代码了解有多少种可用的文本外观样式资源。
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Loading…
Cancel
Save