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/ui/NotesPreferenceActivity.java

398 lines
20 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.ui;
// 导入所需的Android SDK类和包
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
// 导入Notes应用特有的资源和数据类
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.gtask.remote.GTaskSyncService;
// NotesPreferenceActivity类继承自PreferenceActivity用于显示和处理应用的设置界面
public class NotesPreferenceActivity extends PreferenceActivity {
// 类的静态常量
public static final String PREFERENCE_NAME = "notes_preferences";
public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name";
public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time";
public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear";
private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key";
private static final String AUTHORITIES_FILTER_KEY = "authorities";
// 类的成员变量
private PreferenceCategory mAccountCategory; // 账户设置的PreferenceCategory
private GTaskReceiver mReceiver; // 用于接收同步状态广播的BroadcastReceiver
private Account[] mOriAccounts; // 原始账户数组
private boolean mHasAddedAccount; // 是否添加了账户
// onCreate方法Activity创建时调用
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
// 设置ActionBar的返回键
getActionBar().setDisplayHomeAsUpEnabled(true);
// 从XML资源文件中添加偏好设置
addPreferencesFromResource(R.xml.preferences);
mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);
mReceiver = new GTaskReceiver(); // 创建BroadcastReceiver
IntentFilter filter = new IntentFilter(); // 创建IntentFilter
filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); // 添加过滤的Action
registerReceiver(mReceiver, filter); // 注册BroadcastReceiver
mOriAccounts = null; // 初始化原始账户数组
View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); // 从XML布局文件中inflate头部视图
getListView().addHeaderView(header, null, true); // 将头部视图添加到ListView中
}
// onResume方法Activity回到前台时调用
@Override
protected void onResume() {
super.onResume();
// 如果用户添加了新账户,自动设置同步账户
if (mHasAddedAccount) {
Account[] accounts = getGoogleAccounts(); // 获取Google账户数组
if (mOriAccounts != null && accounts.length > mOriAccounts.length) {
for (Account accountNew : accounts) {
boolean found = false;
for (Account accountOld : mOriAccounts) {
if (TextUtils.equals(accountOld.name, accountNew.name)) {
found = true;
break;
}
}
if (!found) {
setSyncAccount(accountNew.name); // 设置同步账户
break;
}
}
}
}
refreshUI(); // 刷新用户界面
}
// onDestroy方法Activity销毁时调用
@Override
protected void onDestroy() {
if (mReceiver != null) {
unregisterReceiver(mReceiver); // 注销BroadcastReceiver
}
super.onDestroy();
}
// loadAccountPreference方法加载账户偏好设置
private void loadAccountPreference() {
mAccountCategory.removeAll(); // 移除所有账户偏好设置
Preference accountPref = new Preference(this); // 创建新的Preference
final String defaultAccount = getSyncAccountName(this); // 获取默认同步账户名
accountPref.setTitle(getString(R.string.preferences_account_title)); // 设置标题
accountPref.setSummary(getString(R.string.preferences_account_summary)); // 设置摘要
accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { // 设置Preference点击事件监听器
public boolean onPreferenceClick(Preference preference) {
if (!GTaskSyncService.isSyncing()) { // 如果没有正在同步
if (TextUtils.isEmpty(defaultAccount)) { // 如果默认账户名为空
// 第一次设置账户
showSelectAccountAlertDialog(); // 显示选择账户的AlertDialog
} else {
// 如果账户已经设置,提示用户风险
showChangeAccountConfirmAlertDialog(); // 显示确认更改账户的AlertDialog
}
} else {
Toast.makeText(NotesPreferenceActivity.this,
R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT)
.show(); // 显示不能更改账户的Toast
}
return true; // 返回true表示已经处理了点击事件
}
});
mAccountCategory.addPreference(accountPref); // 将新的Preference添加到账户设置中
}
// loadSyncButton方法加载同步按钮
private void loadSyncButton() {
Button syncButton = (Button) findViewById(R.id.preference_sync_button); // 获取同步按钮
TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); // 获取最后同步时间的TextView
// 设置按钮状态
if (GTaskSyncService.isSyncing()) { // 如果正在同步
syncButton.setText(getString(R.string.preferences_button_sync_cancel)); // 设置按钮文本为"取消同步"
syncButton.setOnClickListener(new View.OnClickListener() { // 设置点击事件监听器
public void onClick(View v) {
GTaskSyncService.cancelSync(NotesPreferenceActivity.this); // 取消同步
}
});
} else { // 如果没有正在同步
syncButton.setText(getString(R.string.preferences_button_sync_immediately)); // 设置按钮文本为"立即同步"
syncButton.setOnClickListener(new View.OnClickListener() { // 设置点击事件监听器
public void onClick(View v) {
GTaskSyncService.startSync(NotesPreferenceActivity.this); // 开始同步
}
});
}
syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); // 设置按钮是否可用
// 设置最后同步时间
if (GTaskSyncService.isSyncing()) { // 如果正在同步
lastSyncTimeView.setText(GTaskSyncService.getProgressString()); // 设置同步进度字符串
lastSyncTimeView.setVisibility(View.VISIBLE); // 设置TextView可见
} else { // 如果没有正在同步
long lastSyncTime = getLastSyncTime(this); // 获取最后同步时间
if (lastSyncTime != 0) { // 如果最后同步时间不为0
lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time,
DateFormat.format(getString(R.string.preferences_last_sync_time_format),
lastSyncTime))); // 设置最后同步时间字符串
lastSyncTimeView.setVisibility(View.VISIBLE); // 设置TextView可见
} else {
lastSyncTimeView.setVisibility(View.GONE); // 设置TextView不可见
}
}
}
// refreshUI方法用于刷新设置界面的用户界面
private void refreshUI() {
loadAccountPreference(); // 加载账户偏好设置
loadSyncButton(); // 加载同步按钮状态
}
// showSelectAccountAlertDialog方法显示选择账户的AlertDialog
private void showSelectAccountAlertDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); // 创建AlertDialog.Builder对象
// inflate对话框标题布局
View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null);
TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);
titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); // 设置标题文本
TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);
subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); // 设置副标题文本
dialogBuilder.setCustomTitle(titleView); // 设置自定义标题
dialogBuilder.setPositiveButton(null, null); // 设置PositiveButton这里没有文本和监听器
Account[] accounts = getGoogleAccounts(); // 获取Google账户数组
String defAccount = getSyncAccountName(this); // 获取当前同步账户名
mOriAccounts = accounts; // 保存原始账户数组
mHasAddedAccount = false; // 初始化是否添加账户标志为false
if (accounts.length > 0) {
CharSequence[] items = new CharSequence[accounts.length]; // 创建账户名数组
final CharSequence[] itemMapping = items; // 用于映射点击的账户名
int checkedItem = -1; // 默认没有选中项
int index = 0;
for (Account account : accounts) {
if (TextUtils.equals(account.name, defAccount)) {
checkedItem = index; // 如果账户名等于当前同步账户名,则设置为选中项
}
items[index++] = account.name; // 将账户名添加到数组
}
dialogBuilder.setSingleChoiceItems(items, checkedItem, // 设置单选项目
new DialogInterface.OnClickListener() { // 设置点击事件监听器
public void onClick(DialogInterface dialog, int which) {
setSyncAccount(itemMapping[which].toString()); // 设置同步账户
dialog.dismiss(); // 关闭对话框
refreshUI(); // 刷新用户界面
}
});
}
// inflate添加账户的布局
View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null);
dialogBuilder.setView(addAccountView); // 设置对话框内容视图
final AlertDialog dialog = dialogBuilder.show(); // 显示对话框
addAccountView.setOnClickListener(new View.OnClickListener() { // 设置添加账户视图的点击事件监听器
public void onClick(View v) {
mHasAddedAccount = true; // 设置添加账户标志为true
Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); // 创建添加账户的Intent
intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { // 设置Authorities过滤
"gmail-ls"
});
startActivityForResult(intent, -1); // 启动结果Activity
dialog.dismiss(); // 关闭对话框
}
});
}
// showChangeAccountConfirmAlertDialog方法显示更改账户的确认AlertDialog
private void showChangeAccountConfirmAlertDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); // 创建AlertDialog.Builder对象
// inflate对话框标题布局
View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null);
TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title);
titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, // 设置标题文本
getSyncAccountName(this)));
TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle);
subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); // 设置副标题文本
dialogBuilder.setCustomTitle(titleView); // 设置自定义标题
CharSequence[] menuItemArray = new CharSequence[] { // 创建菜单项数组
getString(R.string.preferences_menu_change_account),
getString(R.string.preferences_menu_remove_account),
getString(R.string.preferences_menu_cancel)
};
dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { // 设置点击事件监听器
public void onClick(DialogInterface dialog, int which) {
if (which == 0) { // 如果点击更改账户
showSelectAccountAlertDialog(); // 显示选择账户对话框
} else if (which == 1) { // 如果点击移除账户
removeSyncAccount(); // 移除同步账户
refreshUI(); // 刷新用户界面
}
}
});
dialogBuilder.show(); // 显示对话框
}
// getGoogleAccounts方法获取Google账户数组
private Account[] getGoogleAccounts() {
AccountManager accountManager = AccountManager.get(this); // 获取AccountManager对象
return accountManager.getAccountsByType("com.google"); // 获取类型为"com.google"的账户数组
}
// setSyncAccount方法设置同步账户
private void setSyncAccount(String account) {
if (!getSyncAccountName(this).equals(account)) { // 如果当前同步账户名不等于传入账户名
SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); // 获取SharedPreferences对象
SharedPreferences.Editor editor = settings.edit(); // 获取编辑器
if (account != null) {
editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); // 设置同步账户名
} else {
editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); // 清除同步账户名
}
editor.commit(); // 提交更改
// 清除最后同步时间
setLastSyncTime(this, 0);
// 清除本地gtask相关信息
new Thread(new Runnable() { // 创建新线程
public void run() {
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(NoteColumns.GTASK_ID, ""); // 清除GTASK_ID
values.put(NoteColumns.SYNC_ID, 0); // 清除SYNC_ID
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); // 更新笔记数据
}
}).start();
Toast.makeText(NotesPreferenceActivity.this, // 显示设置账户成功的Toast
getString(R.string.preferences_toast_success_set_accout, account),
Toast.LENGTH_SHORT).show();
}
}
// removeSyncAccount方法移除同步账户
private void removeSyncAccount() {
SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); // 获取SharedPreferences对象
SharedPreferences.Editor editor = settings.edit(); // 获取编辑器
if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { // 如果包含同步账户名
editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); // 移除同步账户名
}
if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { // 如果包含最后同步时间
editor.remove(PREFERENCE_LAST_SYNC_TIME); // 移除最后同步时间
}
editor.commit(); // 提交更改
// 清除本地gtask相关信息
new Thread(new Runnable() { // 创建新线程
public void run() {
ContentValues values = new ContentValues(); // 创建ContentValues对象
values.put(NoteColumns.GTASK_ID, ""); // 清除GTASK_ID
values.put(NoteColumns.SYNC_ID, 0); // 清除SYNC_ID
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); // 更新笔记数据
}
}).start();
}
// getSyncAccountName方法获取同步账户名
public static String getSyncAccountName(Context context) {
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); // 获取SharedPreferences对象
return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); // 获取同步账户名,如果没有则返回空字符串
}
// setLastSyncTime方法设置最后同步时间
public static void setLastSyncTime(Context context, long time) {
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); // 获取SharedPreferences对象
SharedPreferences.Editor editor = settings.edit(); // 获取编辑器
editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); // 设置最后同步时间
editor.commit(); // 提交更改
}
// getLastSyncTime方法获取最后同步时间
public static long getLastSyncTime(Context context) {
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); // 获取SharedPreferences对象
return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); // 获取最后同步时间如果没有则返回0
}
// GTaskReceiver类继承自BroadcastReceiver用于接收同步状态广播
private class GTaskReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
refreshUI(); // 刷新用户界面
if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { // 如果正在同步
TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); // 获取同步状态TextView
syncStatus.setText(intent.getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); // 设置同步进度文本
}
}
}
// onOptionsItemSelected方法处理选项菜单项的点击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: // 如果点击的是home键
Intent intent = new Intent(this, NotesListActivity.class); // 创建Intent跳转到NotesListActivity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 添加标记清除之前的Activity
startActivity(intent); // 启动新的Activity
return true; // 返回true表示已经处理了点击事件
default: // 默认情况
return false; // 返回false表示没有处理点击事件
}
}
}