|
|
/*
|
|
|
* 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;
|
|
|
|
|
|
// GTaskASyncTask类继承自AsyncTask,用于在后台执行与GTask相关的任务,并根据任务进度和结果进行相应的界面反馈(如显示通知等),同时支持任务取消等操作
|
|
|
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
|
|
|
|
|
|
// 定义一个静态的整数,作为GTask同步相关通知在系统中的唯一标识符,用于区分不同的通知
|
|
|
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
|
|
|
|
|
|
// 定义一个接口,用于定义任务完成时需要执行的回调方法,外部类实现此接口来处理任务完成后的逻辑
|
|
|
public interface OnCompleteListener {
|
|
|
void onComplete();
|
|
|
}
|
|
|
|
|
|
// 用于保存应用的上下文环境,方便后续获取系统服务、资源等操作
|
|
|
private Context mContext;
|
|
|
|
|
|
// 用于管理和显示通知的系统服务对象,通过它可以创建、更新和取消通知
|
|
|
private NotificationManager mNotifiManager;
|
|
|
|
|
|
// GTask管理类的实例,负责具体的GTask相关业务逻辑,比如执行同步操作等
|
|
|
private GTaskManager mTaskManager;
|
|
|
|
|
|
// 实现了OnCompleteListener接口的对象引用,用于在任务完成后进行回调通知
|
|
|
private OnCompleteListener mOnCompleteListener;
|
|
|
|
|
|
// 构造函数,用于创建GTaskASyncTask实例,传入上下文和任务完成监听器对象
|
|
|
public GTaskASyncTask(Context context, OnCompleteListener listener) {
|
|
|
// 将传入的上下文赋值给成员变量,方便后续使用
|
|
|
mContext = context;
|
|
|
// 保存传入的任务完成监听器对象
|
|
|
mOnCompleteListener = listener;
|
|
|
// 获取系统的通知管理服务,以便后续可以发送通知
|
|
|
mNotifiManager = (NotificationManager) mContext
|
|
|
.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
|
// 获取GTaskManager的单例实例,用于执行具体的GTask相关任务操作
|
|
|
mTaskManager = GTaskManager.getInstance();
|
|
|
}
|
|
|
|
|
|
// 用于取消正在进行的GTask同步任务,通过调用GTaskManager中的取消同步方法来实现
|
|
|
public void cancelSync() {
|
|
|
mTaskManager.cancelSync();
|
|
|
}
|
|
|
|
|
|
// 对外提供的方法,用于发布任务执行的进度信息,实际上是调用AsyncTask的publishProgress方法来通知主线程更新进度显示
|
|
|
public void publishProgess(String message) {
|
|
|
// 创建一个包含要发布消息的字符串数组,并调用publishProgress方法传递该数组
|
|
|
publishProgress(new String[] {
|
|
|
message
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 私有方法,用于创建并显示通知,根据传入的提示文本ID和具体内容来构建通知并发送到通知栏
|
|
|
private void showNotification(int tickerId, String content) {
|
|
|
PendingIntent pendingIntent;
|
|
|
// 根据传入的提示文本ID判断,如果不是表示成功的提示文本ID(通常对应不同的后续操作意图)
|
|
|
if (tickerId!= R.string.ticker_success) {
|
|
|
// 创建一个PendingIntent,用于当用户点击通知时,启动NotesPreferenceActivity,设置为不可变(遵循Android系统的一些安全和兼容性要求)
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE);
|
|
|
} else {
|
|
|
// 如果是表示成功的提示文本ID,则创建一个PendingIntent,用于当用户点击通知时,启动NotesListActivity,同样设置为不可变
|
|
|
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
|
|
|
NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
|
|
|
}
|
|
|
|
|
|
// 使用Notification.Builder来构建通知对象,设置通知的一系列属性
|
|
|
Notification.Builder builder = new Notification.Builder(mContext)
|
|
|
// 设置通知点击后自动取消
|
|
|
.setAutoCancel(true)
|
|
|
// 设置通知的标题,从资源文件中获取应用名称作为标题
|
|
|
.setContentTitle(mContext.getString(R.string.app_name))
|
|
|
// 设置通知的内容文本,传入具体的内容字符串
|
|
|
.setContentText(content)
|
|
|
// 设置通知的点击意图,即用户点击通知后要执行的操作(由前面创建的PendingIntent决定)
|
|
|
.setContentIntent(pendingIntent)
|
|
|
// 设置通知触发的时间,使用当前系统时间
|
|
|
.setWhen(System.currentTimeMillis())
|
|
|
// 设置通知为持续进行状态(比如在同步过程中一直显示,直到任务完成等情况)
|
|
|
.setOngoing(true);
|
|
|
|
|
|
// 获取构建好的通知对象(在不同的Android版本中,获取方式可能有所不同,这里是一种常见的方式)
|
|
|
Notification notification = builder.getNotification();
|
|
|
// 通过通知管理器发送通知,使用之前定义的通知ID来标识该通知,确保唯一性
|
|
|
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
|
|
|
}
|
|
|
|
|
|
// 在后台线程中执行的方法,用于执行实际的GTask同步任务相关逻辑,同时发布初始的进度信息
|
|
|
@Override
|
|
|
protected Integer doInBackground(Void... unused) {
|
|
|
// 发布同步登录进度信息,从资源文件中获取格式化后的字符串,其中包含同步账号名称(通过NotesPreferenceActivity获取)
|
|
|
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
|
|
|
.getSyncAccountName(mContext)));
|
|
|
// 调用GTaskManager的sync方法执行同步操作,并返回同步结果(通常是表示不同状态的整数)
|
|
|
return mTaskManager.sync(mContext, this);
|
|
|
}
|
|
|
|
|
|
// 在主线程中执行的方法,用于处理任务执行过程中的进度更新情况,显示相应的通知,并在特定条件下发送广播通知相关组件
|
|
|
@Override
|
|
|
protected void onProgressUpdate(String... progress) {
|
|
|
// 根据进度信息显示相应的通知,使用表示正在同步的提示文本ID和传入的具体进度消息内容
|
|
|
showNotification(R.string.ticker_syncing, progress[0]);
|
|
|
// 如果当前上下文对象是GTaskSyncService类型(可能是在特定的服务环境中运行该任务)
|
|
|
if (mContext instanceof GTaskSyncService) {
|
|
|
// 则通过该服务发送广播,广播内容为进度消息,用于通知其他相关组件任务进度情况
|
|
|
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 在主线程中执行的方法,用于处理任务执行完成后的逻辑,根据不同的任务结果显示相应的通知,并在有任务完成监听器的情况下进行回调通知
|
|
|
@Override
|
|
|
protected void onPostExecute(Integer result) {
|
|
|
// 如果任务结果表示成功(通常对应GTaskManager中定义的表示成功的状态常量)
|
|
|
if (result == GTaskManager.STATE_SUCCESS) {
|
|
|
// 显示表示成功的通知,通知内容包含成功同步的账号信息(从资源文件中获取格式化后的字符串,包含账号信息,通过GTaskManager获取账号)
|
|
|
showNotification(R.string.ticker_success, mContext.getString(
|
|
|
R.string.success_sync_account, mTaskManager.getSyncAccount()));
|
|
|
// 在NotesPreferenceActivity中记录最后同步时间,传入当前系统时间
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
// 如果存在任务完成监听器对象(即外部传入了实现了OnCompleteListener接口的对象)
|
|
|
if (mOnCompleteListener!= null) {
|
|
|
// 创建一个新线程,用于执行任务完成的回调方法,避免阻塞主线程等情况
|
|
|
new Thread(new Runnable() {
|
|
|
|
|
|
public void run() {
|
|
|
// 调用任务完成监听器的onComplete方法,通知外部任务已完成,由外部实现具体的后续逻辑
|
|
|
mOnCompleteListener.onComplete();
|
|
|
}
|
|
|
}).start();
|
|
|
}
|
|
|
}
|
|
|
} |