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

389 lines
21 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;//引入ui包
import android.accounts.Account;//第19到48行导入各种类
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;//继承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;//引入R包
import net.micode.notes.data.Notes.NoteColumns;//小米便签栏
import net.micode.notes.gtask.remote.GTaskSyncService;
public class NotesPreferenceActivity extends PreferenceActivity {//NotesPreferenceActivity在小米便签中主要实现的是对背景颜色和字体大小的数据储存。
public static final String PREFERENCE_NAME = "notes_preferences";//继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity
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;//账户分组
private GTaskReceiver mReceiver;//同步任务接收器
private Account[] mOriAccounts;//账户
private boolean mHasAddedAccount;//账户标记
@Override
protected void onCreate(Bundle icicle) {//新建Activity
super.onCreate(icicle);//执行父类创建函数
/* using the app icon for navigation */
getActionBar().setDisplayHomeAsUpEnabled(true);//给左上角图标的左边加上一个返回的图标
addPreferencesFromResource(R.xml.preferences);//给左上角图标的左边加上一个返回的图标
mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);//根据同步账户密码进行账户分组
mReceiver = new GTaskReceiver();//根据同步账户关键码来初始化分组
IntentFilter filter = new IntentFilter();//设置过滤项
filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME);
registerReceiver(mReceiver, filter);//初始化同步组件
mOriAccounts = null;//初始化同步组件
View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);//从xml获取Listview
getListView().addHeaderView(header, null, true);//在listview组件上方添加其它组件
}
@Override
protected void onResume() {//activity交互功能的实现用于接受用户的输入
super.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() {//销毁Activity
if (mReceiver != null) {//销毁接收器
unregisterReceiver(mReceiver);//注销接收器
}
super.onDestroy();//执行销毁动作
}
private void loadAccountPreference() {//设置账户信息
mAccountCategory.removeAll();//移除所有分组
Preference accountPref = new Preference(this);//建立首选项
final String defaultAccount = getSyncAccountName(this);//默认账户为当前账户
accountPref.setTitle(getString(R.string.preferences_account_title));//首选项的大小标题
accountPref.setSummary(getString(R.string.preferences_account_summary));//与google task同步便签记录
accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {//建立监听器
public boolean onPreferenceClick(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中显示不能修改
Toast.makeText(NotesPreferenceActivity.this,
R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT)
.show();
}
return true;
}
});
mAccountCategory.addPreference(accountPref);//根据新建首选项编辑新的账户分组
}
private void loadSyncButton() {//设置同步按键和最近同步时间
Button syncButton = (Button) findViewById(R.id.preference_sync_button);//配置资源设置一个button
TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_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);//根据当前同步服务器设置时间显示框的文本以及可见性
} 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)));//非同步时若最近同步时间不为0则显示最近同步时间
lastSyncTimeView.setVisibility(View.VISIBLE);//根据最后同步时间的信息来编辑时间显示框的文本内容和可见性
} else {
lastSyncTimeView.setVisibility(View.GONE);//最近同步时间为空设置同步时间不可见
}
}
}
private void refreshUI() {//刷新标签界面
loadAccountPreference();
loadSyncButton();//加载“保存”按钮
}
private void showSelectAccountAlertDialog() {//显示账户选择的对话框并进行账户的设置
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);//创建一个新的对话框
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);//不设置“确定”的按钮
Account[] accounts = getGoogleAccounts();//获得谷歌账户
String defAccount = getSyncAccountName(this);//默认的账户
mOriAccounts = accounts;//获取同步账户信息
mHasAddedAccount = 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();//刷新界面
}
});
}
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;//将新加账户的hash置为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() {//刷新标签界面
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);//创建一个新的对话框
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) {//设置对话框要显示的一个list用于显示几个命令时,即changeremovecancel
if (which == 0) {//进入账户选择对话框
showSelectAccountAlertDialog();//显示账户选择提示对话框
} else if (which == 1) {//删除同步账户
removeSyncAccount();//删除账户并且跟新便签界面
refreshUI();
}
}
});
dialogBuilder.show();//显示对话框
}
private Account[] getGoogleAccounts() {//获取谷歌账户,可通过账户管理器直接获取
AccountManager accountManager = AccountManager.get(this);
return accountManager.getAccountsByType("com.google");
}
private void setSyncAccount(String account) {//设置同步账户
if (!getSyncAccountName(this).equals(account)) {//如果该账号不在同步账号列表中
SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();//编辑共享首选项
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() {//清除本地的gtask关联的信息
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();//重置当地同步任务的信息
Toast.makeText(NotesPreferenceActivity.this,//设置一个toast提示信息提示用户成功设置同步
getString(R.string.preferences_toast_success_set_accout, account),
Toast.LENGTH_SHORT).show();//将toast的文本信息置为“设置账户成功”并显示出来
}
}
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();//提交更新后的数据
// clean up local gtask related info
new Thread(new Runnable() {//新线程的创建
public void run() {//清除本地的gtask关联的信息将一些参数设置为0或NULL
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();
}
public static String getSyncAccountName(Context context) {//获取同步账户名称,通过共享的首选项里的信息直接获取
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE);//获取同步账户名称
return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, "");
}
public static void setLastSyncTime(Context context, long time) {//设置最终同步的时间
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();//从共享首选项中找到相关账户并获取其编辑器
editor.putLong(PREFERENCE_LAST_SYNC_TIME, time);
editor.commit();//编辑最终同步时间并提交更新
}
public static long getLastSyncTime(Context context) {//获取最终同步时间
SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME,
Context.MODE_PRIVATE);//通过共享,获取时间
return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0);
}
private class GTaskReceiver extends BroadcastReceiver {//接受同步信息
@Override
public void onReceive(Context context, Intent intent) {//刷新界面,判断是否同步状态下
refreshUI();
if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) {//获取随广播而来的Intent中的同步服务的数据
TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview);//通过获取的数据在设置系统的状态
syncStatus.setText(intent
.getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG));
}//通过获取的数据在设置系统的状态
}
}
public boolean onOptionsItemSelected(MenuItem item) {//处理菜单的选项
switch (item.getItemId()) {//根据选项的id选择这里只有一个主页
case android.R.id.home://返回主界面
Intent intent = new Intent(this, NotesListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);//创建活动
return true;
default://在主页情况下在创建连接组件intent发出清空的信号并开始一个相应的activity
return false;
}
}
}