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.
git.text/src/gtask/remote/GTaskASyncTask.java

235 lines
8.7 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.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;
/**
* <p>Google任务异步同步任务类。</p>
* <p>设计意图使用AsyncTask实现Google任务的异步同步操作避免阻塞主线程并提供用户友好的通知反馈。</p>
* <p>核心职责:</p>
* <ul>
* <li>在后台线程执行Google任务的同步操作</li>
* <li>显示同步进度和结果的通知</li>
* <li>处理同步完成后的回调</li>
* <li>支持取消同步操作</li>
* </ul>
* <p>关键关联:</p>
* <ul>
* <li>继承自{@link AsyncTask},实现异步任务框架</li>
* <li>使用{@link GTaskManager}执行实际的同步逻辑</li>
* <li>与{@link GTaskSyncService}配合,支持服务环境下的广播通知</li>
* <li>通过{@link OnCompleteListener}提供同步完成回调</li>
* </ul>
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
/**
* Google任务同步通知的唯一ID
*/
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
/**
* <p>同步完成监听器接口。</p>
* <p>设计意图提供Google任务同步完成后的回调机制。</p>
*/
public interface OnCompleteListener {
/**
* 同步完成时调用的方法
*/
void onComplete();
}
/**
* 上下文对象,用于访问系统服务和资源
*/
private Context mContext;
/**
* 通知管理器,用于显示同步进度和结果通知
*/
private NotificationManager mNotifiManager;
/**
* Google任务管理器用于执行实际的同步逻辑
*/
private GTaskManager mTaskManager;
/**
* 同步完成监听器,用于处理同步完成后的回调
*/
private OnCompleteListener mOnCompleteListener;
/**
* 构造方法初始化Google任务异步同步任务。
*
* @param context 上下文对象,用于访问系统服务和资源
* @param listener 同步完成监听器,用于处理同步完成后的回调
*/
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();
}
/**
* 发布同步进度信息。
*
* @param message 进度信息消息
*/
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);
// }
/**
* <p>显示同步通知。</p>
* <p>业务逻辑:根据同步状态创建并显示相应的通知,支持成功、失败、取消等不同状态。</p>
* <p>通知点击行为:
* <ul>
* <li>成功状态:点击打开笔记列表页面</li>
* <li>其他状态:点击打开笔记设置页面</li>
* </ul>
* </p>
*
* @param tickerId 通知标题资源ID
* @param content 通知内容字符串
*/
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);
}
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 notification=builder.getNotification();
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
/**
* <p>在后台线程执行同步操作。</p>
* <p>业务逻辑初始化同步进度通知调用GTaskManager执行实际的同步逻辑。</p>
*
* @param unused 未使用的参数
* @return 同步结果状态码对应GTaskManager中的STATE_*常量
*/
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext)));
return mTaskManager.sync(mContext, this);
}
/**
* <p>更新同步进度。</p>
* <p>业务逻辑:显示当前同步进度通知,如果在服务环境下,还会发送广播通知。</p>
*
* @param progress 进度信息数组,其中第一个元素为进度消息
*/
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
/**
* <p>处理同步结果。</p>
* <p>业务逻辑:根据同步结果显示相应的通知,更新最后同步时间,并调用完成监听器。</p>
* <p>同步结果处理:
* <ul>
* <li>STATE_SUCCESS显示成功通知更新最后同步时间</li>
* <li>STATE_NETWORK_ERROR显示网络错误通知</li>
* <li>STATE_INTERNAL_ERROR显示内部错误通知</li>
* <li>STATE_SYNC_CANCELLED显示同步取消通知</li>
* </ul>
* </p>
*
* @param result 同步结果状态码对应GTaskManager中的STATE_*常量
*/
@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();
}
}
}