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

389 lines
24 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;
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;
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;
public class NotesPreferenceActivity extends PreferenceActivity { /*定义一个名为 NotesPreferenceActivity 的类,继承自 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; /*定义一个 GTaskReceiver 类型的成员变量,用于接收广播*/
private Account[] mOriAccounts; /*定义一个 Account 数组类型的成员变量,用于存储原始账户列表*/
private boolean mHasAddedAccount; /*定义一个布尔类型的成员变量,用于标记是否已经添加过账户*/
@Override
protected void onCreate(Bundle icicle) { /*重写 onCreate 方法,当 Activity 被创建时调用*/
super.onCreate(icicle); /*调用父类的 onCreate 方法*/
/* using the app icon for navigation */
getActionBar().setDisplayHomeAsUpEnabled(true); /*获取 ActionBar 并设置返回按钮显示应用图标*/
addPreferencesFromResource(R.xml.preferences); /*从指定的 XML 文件中加载偏好设置*/
mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);/*查找 PreferenceCategory 类型的偏好设置项,并赋值给 mAccountCategory 成员变量*/
mReceiver = new GTaskReceiver(); /*创建 GTaskReceiver 类型的对象*/
IntentFilter filter = new IntentFilter(); /*创建 IntentFilter 对象*/
filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); /*向 IntentFilter 中添加动作,用于接收特定广播*/
registerReceiver(mReceiver, filter); /*注册 BroadcastReceiver接收指定的动作广播*/
mOriAccounts = null; /*初始化 mOriAccounts 为空*/
View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); /*使用 LayoutInflater 加载头部布局*/
getListView().addHeaderView(header, null, true); /*向 ListView 中添加头部视图*/
}
@Override
protected void onResume() { /*重写 onResume 方法,当 Activity 从不可见变为可见时调用*/
super.onResume(); /*调用父类的 onResume 方法*/
// need to set sync account automatically if user has added a new
// account
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(); /*刷新界面,显示最新的账户信息*/
}
@Override
protected void onDestroy() { /*重写 onDestroy 方法,当 Activity 被销毁时调用*/
if (mReceiver != null) { /*检查 mReceiver 是否不为空*/
unregisterReceiver(mReceiver); /*注销广播接收者 mReceiver防止内存泄漏*/
}
super.onDestroy(); /*调用父类的 onDestroy 方法,完成销毁操作*/
}
private void loadAccountPreference() { /*定义一个私有方法 loadAccountPreference用于加载账户偏好设置*/
mAccountCategory.removeAll(); /*清空 mAccountCategory 中的所有子项*/
Preference accountPref = new Preference(this); /*创建一个新的 Preference 对象*/
final String defaultAccount = getSyncAccountName(this); /*获取当前设置的同步账户名字*/
accountPref.setTitle(getString(R.string.preferences_account_title)); /*设置 Preference 的标题*/
accountPref.setSummary(getString(R.string.preferences_account_summary)); /*设置 Preference 的摘要*/
accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) { /*为 Preference 设置点击监听器*/
if (!GTaskSyncService.isSyncing()) { /*检查同步服务是否正在同步*/
if (TextUtils.isEmpty(defaultAccount)) { /*检查是否已经设置了同步账户*/
// the first time to set account
showSelectAccountAlertDialog(); /*如果没有设置同步账户,显示选择账户的对话框*/
} else {
// if the account has already been set, we need to promp
// user about the risk
showChangeAccountConfirmAlertDialog(); /*如果已经设置了同步账户,显示确认更改账户的对话框*/
}
} else {
Toast.makeText(NotesPreferenceActivity.this,
R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT)
.show(); /*如果同步服务正在同步,显示一个提示,告知用户不能更改账户*/
}
return true; /*返回 true 表示点击事件已处理*/
}
});
mAccountCategory.addPreference(accountPref); /*将 Preference 添加到 mAccountCategory 中*/
}
private void loadSyncButton() { /*定义一个私有方法 loadSyncButton用于加载同步按钮和最后同步时间的显示*/
Button syncButton = (Button) findViewById(R.id.preference_sync_button); /*通过 ID 获取同步按钮*/
TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); /*通过 ID 获取显示最后同步时间的 TextView*/
// set button state
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))); /*设置按钮是否启用,取决于是否设置了同步账户*/
// set last sync time
if (GTaskSyncService.isSyncing()) { /*检查同步服务是否正在同步*/
lastSyncTimeView.setText(GTaskSyncService.getProgressString()); /*如果正在同步,显示同步进度*/
lastSyncTimeView.setVisibility(View.VISIBLE); /*显示 TextView*/
} else {
long lastSyncTime = getLastSyncTime(this); /*获取最后同步的时间*/
if (lastSyncTime != 0) { /*检查最后同步时间是否为零*/
lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time,
DateFormat.format(getString(R.string.preferences_last_sync_time_format),
lastSyncTime))); /*设置 TextView 显示最后同步时间*/
lastSyncTimeView.setVisibility(View.VISIBLE); /*显示 TextView*/
} else {
lastSyncTimeView.setVisibility(View.GONE); /*如果没有同步时间,隐藏 TextView*/
}
}
}
private void refreshUI() { /*定义一个私有方法 refreshUI用于刷新界面*/
loadAccountPreference(); /*/*调用 loadAccountPreference 方法,加载账户偏好设置*/*/
loadSyncButton(); /*调用 loadSyncButton 方法,加载同步按钮和最后同步时间的显示*/
}
private void showSelectAccountAlertDialog() { /*定义一个私有方法 showSelectAccountAlertDialog用于显示选择账户的对话框*/
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); /*创建一个 AlertDialog.Builder 对象*/
View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); /*通过 LayoutInflater 加载自定义的对话框标题视图*/
TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); /*获取标题视图中的 TextView*/
titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); /*设置标题文本*/
TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); /*获取副标题视图中的 TextView*?*/
subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); /*设置副标题文本*/
dialogBuilder.setCustomTitle(titleView); /*设置自定义的对话框标题*/
dialogBuilder.setPositiveButton(null, null); /*设置正按钮(这里没有实际内容)*/
Account[] accounts = getGoogleAccounts(); /*获取设备上的所有 Google 账户*/
String defAccount = getSyncAccountName(this); /*获取当前设置的同步账户名字*/
mOriAccounts = accounts; /*记录原始账户列表*/
mHasAddedAccount = false; /*标记是否已经添加过账户*/
if (accounts.length > 0) { /*检查是否有可用的账户*/
CharSequence[] items = new CharSequence[accounts.length]; /*创建一个 CharSequence 数组,用于存储账户名称*/
final CharSequence[] itemMapping = items; /*创建一个最终的 CharSequence 数组,用于映射选择的账户*/
int checkedItem = -1; /*初始化选中的项索引*/
int index = 0; /*初始化索引*/
for (Account account : accounts) { /*遍历账户列表*/
if (TextUtils.equals(account.name, defAccount)) { /*检查当前账户是否为默认账户*/
checkedItem = index;
}
items[index++] = account.name; /*将账户名称添加到 items 数组中*/
}
dialogBuilder.setSingleChoiceItems(items, checkedItem,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { /*设置单选列表项及其点击监听器*/
setSyncAccount(itemMapping[which].toString()); /*设置选中的账户为同步账户*/
dialog.dismiss(); /*关闭对话框*/
refreshUI(); /*刷新界面*/
}
});
}
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; /*标记已经添加过账户*/
Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); /*创建一个意图,打开添加账户的设置页面*/
intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] {
"gmail-ls" /*设置意图的额外参数,过滤账户类型*/
});
startActivityForResult(intent, -1); /*启动活动并等待结果*/
dialog.dismiss(); /*关闭对话框*/
}
});
}
private void showChangeAccountConfirmAlertDialog() { /*定义一个私有方法 showChangeAccountConfirmAlertDialog用于显示确认更改账户的对话框*/
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); /*创建一个 AlertDialog.Builder 对象*/
View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); /*通过 LayoutInflater 加载自定义的对话框标题视图*/
TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); /*获取标题视图中的 TextView*/
titleTextView.setText(getString(R.string.preferences_dialog_change_account_title,
getSyncAccountName(this))); /*设置标题文本,包含当前同步账户的名字*/
TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); /*获取副标题视图中的 TextView*/
subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); /*设置副标题文本,警告用户更改账户的风险*/
dialogBuilder.setCustomTitle(titleView); /*设置自定义的对话框标题*/
CharSequence[] menuItemArray = new CharSequence[] { /*创建一个 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(); /*显示对话框*/
}
private Account[] getGoogleAccounts() { /*定义一个私有方法 getGoogleAccounts用于获取设备上的所有 Google 账户*/
AccountManager accountManager = AccountManager.get(this); /*获取 AccountManager 对象*/
return accountManager.getAccountsByType("com.google"); /*返回所有 Google 类型的账户*/
}
private void setSyncAccount(String account) { /*定义一个私有方法 setSyncAccount用于设置同步账户*/
if (!getSyncAccountName(this).equals(account)) { /*检查当前设置的同步账户是否与新账户不同*/
SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); /*获取 SharedPreferences 对象*/
SharedPreferences.Editor editor = settings.edit(); /*获取 SharedPreferences 编辑器*/
if (account != null) { /*如果账户不为空,将其保存到偏好设置中*/
editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); /*保存账户名字*/
} else { /*如果账户为空,保存空字符串*/
editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); /*保存空字符串*/
}
editor.commit(); /*提交编辑*/
// clean up last sync time
setLastSyncTime(this, 0); /*清除最后同步时间*/
// clean up local gtask related info
new Thread(new Runnable() {
public void run() {
ContentValues values = new ContentValues();
values.put(NoteColumns.GTASK_ID, "");
values.put(NoteColumns.SYNC_ID, 0);
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null);
}
}).start(); /*创建并启动一个新线程,清除本地与 GTask 相关的信息*/
Toast.makeText(NotesPreferenceActivity.this,
getString(R.string.preferences_toast_success_set_accout, account),
Toast.LENGTH_SHORT).show(); /*显示一个提示,告知用户成功设置了账户*/
}
}
private void removeSyncAccount() { /*定义一个私有方法 removeSyncAccount用于移除同步账户*/
SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); /*获取 SharedPreferences 对象*/
SharedPreferences.Editor editor = settings.edit(); /*获取 SharedPreferences 编辑器*/
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(); /*提交编辑*/
// clean up local gtask related info
new Thread(new Runnable() { /*创建并启动一个新线程,清除本地与 GTask 相关的信息*/
public void run() {
ContentValues values = new ContentValues(); /*创建 ContentValues 对象*/
values.put(NoteColumns.GTASK_ID, ""); /*设置 GTASK_ID 为空*/
values.put(NoteColumns.SYNC_ID, 0); /*设置 SYNC_ID 为 0*/
getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); /*更新数据库中的相关记录*/
}
}).start();
}
public static String getSyncAccountName(Context context) { /*定义一个静态方法 getSyncAccountName用于获取同步账户名字*/
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE); /*获取 SharedPreferences 对象*/
return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); /*返回同步账户名字,如果没有设置则返回空字符串*/
}
public static void setLastSyncTime(Context context, long time) { /*定义一个静态方法 setLastSyncTime用于设置最后同步时间*/
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE); /*获取 SharedPreferences 对象*/
SharedPreferences.Editor editor = settings.edit(); /*获取 SharedPreferences 编辑器*/
editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); /*保存最后同步时间*/
editor.commit(); /*提交编辑*/
}
public static long getLastSyncTime(Context context) { /*定义一个静态方法 getLastSyncTime用于获取最后同步时间*/
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE); /*获取 SharedPreferences 对象*/
return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); /*返回最后同步时间,如果没有设置则返回 0*/
}
private class GTaskReceiver extends BroadcastReceiver { /*定义一个内部类 GTaskReceiver继承自 BroadcastReceiver*/
@Override
public void onReceive(Context context, Intent intent) { /*重写 onReceive 方法,当接收到广播时调用*/
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)); /*设置 TextView 显示同步进度*/
}
}
}
public boolean onOptionsItemSelected(MenuItem item) { /*重写 onOptionsItemSelected 方法,处理选项菜单项的点击事件*/
switch (item.getItemId()) { /*根据菜单项的 ID 进行处理*/
case android.R.id.home: /*处理 Home 按钮的点击事件*/
Intent intent = new Intent(this, NotesListActivity.class); /*创建一个意图,跳转到 NotesListActivity*/
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); /*添加标志,确保活动栈中的其他活动被清除*/
startActivity(intent); /*启动活动*/
return true; /*返回 true 表示事件已处理*/
default: /*默认情况下返回 false*/
return false;
}
}
}