| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * 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 com.android.email.activity.setup; |
| |
| import android.app.ActionBar; |
| import android.app.Fragment; |
| import android.content.Intent; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.support.annotation.NonNull; |
| import android.view.KeyEvent; |
| import android.view.Menu; |
| import android.view.MenuItem; |
| |
| import com.android.email.R; |
| import com.android.email.setup.AuthenticatorSetupIntentHelper; |
| import com.android.emailcommon.utility.IntentUtilities; |
| import com.android.mail.providers.UIProvider.EditSettingsExtras; |
| import com.android.mail.ui.settings.MailPreferenceActivity; |
| import com.android.mail.utils.Utils; |
| |
| import java.util.List; |
| |
| /** |
| * Handles account preferences, using multi-pane arrangement when possible. |
| * |
| * This activity uses the following fragments: |
| * AccountSettingsFragment |
| * GeneralPreferences |
| * DebugFragment |
| * |
| */ |
| public class EmailPreferenceActivity extends MailPreferenceActivity { |
| /* |
| * Intent to open account settings for account=1 |
| adb shell am start -a android.intent.action.EDIT \ |
| -d '"content://ui.email.android.com/settings?ACCOUNT_ID=1"' |
| */ |
| |
| // Intent extras for our internal activity launch |
| private static final String EXTRA_ENABLE_DEBUG = "AccountSettings.enable_debug"; |
| // STOPSHIP: Do not ship with the debug menu allowed. |
| private static final boolean DEBUG_MENU_ALLOWED = false; |
| |
| // Intent extras for launch directly from system account manager |
| // NOTE: This string must match the one in res/xml/account_preferences.xml |
| private static String INTENT_ACCOUNT_MANAGER_ENTRY; |
| |
| // Key codes used to open a debug settings fragment. |
| private static final int[] SECRET_KEY_CODES = { |
| KeyEvent.KEYCODE_D, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_B, KeyEvent.KEYCODE_U, |
| KeyEvent.KEYCODE_G |
| }; |
| private int mSecretKeyCodeIndex = 0; |
| |
| // When the user taps "Email Preferences" 10 times in a row, we'll enable the debug settings. |
| private int mNumGeneralHeaderClicked = 0; |
| |
| private boolean mShowDebugMenu; |
| private Uri mFeedbackUri; |
| private MenuItem mFeedbackMenuItem; |
| |
| @Override |
| public Intent getIntent() { |
| final Intent intent = super.getIntent(); |
| final long accountId = IntentUtilities.getAccountIdFromIntent(intent); |
| if (accountId < 0) { |
| return intent; |
| } |
| Intent modIntent = new Intent(intent); |
| modIntent.putExtra(EXTRA_SHOW_FRAGMENT, AccountSettingsFragment.class.getCanonicalName()); |
| modIntent.putExtra( |
| EXTRA_SHOW_FRAGMENT_ARGUMENTS, |
| AccountSettingsFragment.buildArguments( |
| IntentUtilities.getAccountNameFromIntent(intent))); |
| modIntent.putExtra(EXTRA_NO_HEADERS, true); |
| return modIntent; |
| } |
| |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| final Intent i = getIntent(); |
| if (savedInstanceState == null) { |
| // If we are not restarting from a previous instance, we need to |
| // figure out the initial prefs to show. (Otherwise, we want to |
| // continue showing whatever the user last selected.) |
| if (INTENT_ACCOUNT_MANAGER_ENTRY == null) { |
| INTENT_ACCOUNT_MANAGER_ENTRY = getString(R.string.intent_account_manager_entry); |
| } |
| if (INTENT_ACCOUNT_MANAGER_ENTRY.equals(i.getAction())) { |
| // This case occurs if we're changing account settings from Settings -> Accounts. |
| // We get an account object in the intent, but it's not actually useful to us since |
| // it's always just the first account of that type. The user can't specify which |
| // account they wish to view from within the settings UI, so just dump them at the |
| // main screen. |
| // android.accounts.Account acct = i.getParcelableExtra("account"); |
| } else if (i.hasExtra(EditSettingsExtras.EXTRA_FOLDER)) { |
| throw new IllegalArgumentException("EXTRA_FOLDER is no longer supported"); |
| } else { |
| // Otherwise, we're called from within the Email app and look for our extras |
| final long accountId = IntentUtilities.getAccountIdFromIntent(i); |
| if (accountId != -1) { |
| final Bundle args = AccountSettingsFragment.buildArguments(accountId); |
| startPreferencePanel(AccountSettingsFragment.class.getName(), args, |
| 0, null, null, 0); |
| } |
| } |
| } |
| mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false); |
| |
| final ActionBar actionBar = getActionBar(); |
| if (actionBar != null) { |
| actionBar.setDisplayOptions( |
| ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); |
| } |
| |
| mFeedbackUri = Utils.getValidUri(getString(R.string.email_feedback_uri)); |
| } |
| |
| /** |
| * Listen for secret sequence and, if heard, enable debug menu |
| */ |
| @Override |
| public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { |
| if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) { |
| mSecretKeyCodeIndex++; |
| if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) { |
| mSecretKeyCodeIndex = 0; |
| enableDebugMenu(); |
| } |
| } else { |
| mSecretKeyCodeIndex = 0; |
| } |
| return super.onKeyDown(keyCode, event); |
| } |
| |
| @Override |
| public boolean onCreateOptionsMenu(Menu menu) { |
| super.onCreateOptionsMenu(menu); |
| getMenuInflater().inflate(R.menu.settings_menu, menu); |
| |
| mFeedbackMenuItem = menu.findItem(R.id.feedback_menu_item); |
| return true; |
| } |
| |
| @Override |
| public boolean onPrepareOptionsMenu(Menu menu) { |
| super.onPrepareOptionsMenu(menu); |
| |
| if (mFeedbackMenuItem != null) { |
| // We only want to enable the feedback menu item, if there is a valid feedback uri |
| mFeedbackMenuItem.setVisible(!Uri.EMPTY.equals(mFeedbackUri)); |
| } |
| return true; |
| } |
| |
| |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| switch (item.getItemId()) { |
| case android.R.id.home: |
| // The app icon on the action bar is pressed. Just emulate a back press. |
| // TODO: this should navigate to the main screen, even if a sub-setting is open. |
| // But we shouldn't just finish(), as we want to show "discard changes?" dialog |
| // when necessary. |
| onBackPressed(); |
| break; |
| case R.id.feedback_menu_item: |
| Utils.sendFeedback(this, mFeedbackUri, false /* reportingProblem */); |
| break; |
| default: |
| return super.onOptionsItemSelected(item); |
| } |
| return true; |
| } |
| |
| @Override |
| public boolean isValidFragment(String fragmentName) { |
| // This activity is not exported, so we can allow any fragment |
| return true; |
| } |
| |
| private void enableDebugMenu() { |
| mShowDebugMenu = true; |
| invalidateHeaders(); |
| } |
| |
| private void onAddNewAccount() { |
| final Intent setupIntent = AuthenticatorSetupIntentHelper.actionNewAccountIntent(this); |
| startActivity(setupIntent); |
| } |
| |
| @Override |
| public void onBuildExtraHeaders(List<Header> target) { |
| super.onBuildExtraHeaders(target); |
| |
| loadHeadersFromResource(R.xml.email_extra_preference_headers, target); |
| |
| // if debug header is enabled, show it |
| if (DEBUG_MENU_ALLOWED) { |
| if (mShowDebugMenu) { |
| // setup lightweight header for debugging |
| final Header debugHeader = new Header(); |
| debugHeader.title = getText(R.string.debug_title); |
| debugHeader.summary = null; |
| debugHeader.iconRes = 0; |
| debugHeader.fragment = DebugFragment.class.getCanonicalName(); |
| debugHeader.fragmentArguments = null; |
| target.add(debugHeader); |
| } |
| } |
| } |
| |
| /** |
| * Called when the user selects an item in the header list. Handles save-data cases as needed |
| * |
| * @param header The header that was selected. |
| * @param position The header's position in the list. |
| */ |
| @Override |
| public void onHeaderClick(@NonNull Header header, int position) { |
| // Secret keys: Click 10x to enable debug settings |
| if (position == 0) { |
| mNumGeneralHeaderClicked++; |
| if (mNumGeneralHeaderClicked == 10) { |
| enableDebugMenu(); |
| } |
| } else { |
| mNumGeneralHeaderClicked = 0; |
| } |
| if (header.id == R.id.add_account_header) { |
| onAddNewAccount(); |
| return; |
| } |
| |
| // Process header click normally |
| super.onHeaderClick(header, position); |
| } |
| |
| @Override |
| public void onAttachFragment(Fragment f) { |
| super.onAttachFragment(f); |
| // When we're changing fragments, enable/disable the add account button |
| invalidateOptionsMenu(); |
| } |
| } |