author | Brian Nicholson <bnicholson@mozilla.com> |
Tue, 26 Feb 2013 21:48:00 -0800 | |
changeset 123120 | 7164bd42720f6f1f7ba9164df0de5386920abed6 |
parent 123119 | ed22faa72a821ccac550b6e821eec34b24611022 |
child 123121 | e3738346f3075b556fb4ba4ec48c8700bfa5ad52 |
push id | 24372 |
push user | emorley@mozilla.com |
push date | Wed, 27 Feb 2013 13:22:59 +0000 |
treeherder | mozilla-central@0a91da5f5eab [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | kats |
bugs | 845612 |
milestone | 22.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/mobile/android/base/AboutHomeContent.java +++ b/mobile/android/base/AboutHomeContent.java @@ -166,32 +166,34 @@ public class AboutHomeContent extends Sc } private void inflate() { mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.abouthome_content, this); mTopSitesGrid = (TopSitesGridView)findViewById(R.id.top_sites_grid); mTopSitesGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { TopSitesViewHolder holder = (TopSitesViewHolder) v.getTag(); String spec = holder.getUrl(); // If we don't have a url, this must be an empty row. Show the edit dialog box if (TextUtils.isEmpty(spec)) { editSite(spec, position); return; } if (mUriLoadCallback != null) mUriLoadCallback.callback(spec); } }); mTopSitesGrid.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; mTopSitesGrid.setSelectedPosition(info.position); MenuInflater inflater = mActivity.getMenuInflater(); inflater.inflate(R.menu.abouthome_topsites_contextmenu, menu); // If nothing is pinned at all, hide both clear items @@ -212,23 +214,25 @@ public class AboutHomeContent extends Sc }); mPromoBox = (AboutHomePromoBox) findViewById(R.id.promo_box); mAddons = (AboutHomeSection) findViewById(R.id.recommended_addons); mLastTabs = (AboutHomeSection) findViewById(R.id.last_tabs); mRemoteTabs = (AboutHomeSection) findViewById(R.id.remote_tabs); mAddons.setOnMoreTextClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { if (mUriLoadCallback != null) mUriLoadCallback.callback("https://addons.mozilla.org/android"); } }); mRemoteTabs.setOnMoreTextClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { mActivity.showRemoteTabs(); } }); setTopSitesConstants(); } @@ -276,16 +280,17 @@ public class AboutHomeContent extends Sc setTopSitesVisibility(hasTopSites); mPromoBox.showRandomPromo(); } private void updateLayoutForSync() { final GeckoApp.StartupMode startupMode = mActivity.getStartupMode(); post(new Runnable() { + @Override public void run() { // The listener might run before the UI is initially updated. // In this case, we should simply wait for the initial setup // to happen. if (mTopSitesAdapter != null) updateLayout(); } }); @@ -297,16 +302,17 @@ public class AboutHomeContent extends Sc if (mTopSitesAdapter != null) { old = mTopSitesAdapter.getCursor(); } // Swap in the new cursor. final Cursor oldCursor = old; final Cursor newCursor = BrowserDB.getTopSites(resolver, mNumberOfTopSites); post(new Runnable() { + @Override public void run() { if (mTopSitesAdapter == null) { mTopSitesAdapter = new TopSitesCursorAdapter(mActivity, R.layout.abouthome_topsite_item, newCursor, new String[] { URLColumns.TITLE }, new int[] { R.id.title }); @@ -432,16 +438,17 @@ public class AboutHomeContent extends Sc public void onPostExecute(Cursor c) { updateTopSitesThumbnails(getThumbnailsFromCursor(c)); } }).execute(); } void update(final EnumSet<UpdateFlags> flags) { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { if (flags.contains(UpdateFlags.TOP_SITES)) loadTopSites(); if (flags.contains(UpdateFlags.PREVIOUS_TABS)) readLastTabs(); if (flags.contains(UpdateFlags.RECOMMENDED_ADDONS)) @@ -570,16 +577,17 @@ public class AboutHomeContent extends Sc addonsArray = new JSONObject(jsonString).getJSONArray("addons"); } catch (JSONException e) { Log.i(LOGTAG, "error reading json file", e); } } final JSONArray array = addonsArray; post(new Runnable() { + @Override public void run() { try { if (array == null || array.length() == 0) { mAddons.hide(); return; } for (int i = 0; i < array.length(); i++) { @@ -598,25 +606,27 @@ public class AboutHomeContent extends Sc drawable.setBounds(sIconBounds); row.setCompoundDrawables(drawable, null, null, null); String iconUrl = jsonobj.getString("iconURL"); String pageUrl = getPageUrlFromIconUrl(iconUrl); final String homepageUrl = jsonobj.getString("homepageURL"); row.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { if (mUriLoadCallback != null) mUriLoadCallback.callback(homepageUrl); } }); Favicons favicons = Favicons.getInstance(); favicons.loadFavicon(pageUrl, iconUrl, true, new Favicons.OnFaviconLoadedListener() { + @Override public void onFaviconLoaded(String url, Bitmap favicon) { if (favicon != null) { Drawable drawable = new BitmapDrawable(favicon); drawable.setBounds(sIconBounds); row.setCompoundDrawables(drawable, null, null, null); } } }); @@ -649,25 +659,27 @@ public class AboutHomeContent extends Sc return; } ContentResolver resolver = mActivity.getContentResolver(); final Bitmap favicon = BrowserDB.getFaviconForUrl(resolver, url); lastTabUrlsList.add(url); AboutHomeContent.this.post(new Runnable() { + @Override public void run() { View container = mInflater.inflate(R.layout.abouthome_last_tabs_row, mLastTabs.getItemsContainer(), false); ((TextView) container.findViewById(R.id.last_tab_title)).setText(tab.getSelectedTitle()); ((TextView) container.findViewById(R.id.last_tab_url)).setText(tab.getSelectedUrl()); if (favicon != null) { ((ImageView) container.findViewById(R.id.last_tab_favicon)).setImageBitmap(favicon); } container.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { int flags = Tabs.LOADURL_NEW_TAB; if (Tabs.getInstance().getSelectedTab().isPrivate()) flags |= Tabs.LOADURL_PRIVATE; Tabs.getInstance().loadUrl(url, flags); } }); @@ -675,20 +687,22 @@ public class AboutHomeContent extends Sc } }); } }.parse(jsonString); final int numLastTabs = lastTabUrlsList.size(); if (numLastTabs >= 1) { post(new Runnable() { + @Override public void run() { if (numLastTabs > 1) { mLastTabs.showMoreText(); mLastTabs.setOnMoreTextClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { int flags = Tabs.LOADURL_NEW_TAB; if (Tabs.getInstance().getSelectedTab().isPrivate()) flags |= Tabs.LOADURL_PRIVATE; for (String url : lastTabUrlsList) { Tabs.getInstance().loadUrl(url, flags); } } @@ -700,16 +714,17 @@ public class AboutHomeContent extends Sc } }); } } private void loadRemoteTabs() { if (!SyncAccounts.syncAccountsExist(mActivity)) { post(new Runnable() { + @Override public void run() { mRemoteTabs.hide(); } }); return; } TabsAccessor.getTabs(getContext(), NUMBER_OF_REMOTE_TABS, this); @@ -1038,16 +1053,17 @@ public class AboutHomeContent extends Sc Intent intent = new Intent(mContext, AwesomeBar.class); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.putExtra(AwesomeBar.TARGET_KEY, AwesomeBar.Target.PICK_SITE.toString()); if (url != null && !TextUtils.isEmpty(url)) { intent.putExtra(AwesomeBar.CURRENT_URL_KEY, url); } int requestCode = GeckoAppShell.sActivityHelper.makeRequestCode(new ActivityResultHandler() { + @Override public void onActivityResult(int resultCode, Intent data) { if (resultCode == Activity.RESULT_CANCELED || data == null) return; final View v = mTopSitesGrid.getChildAt(position); final TopSitesViewHolder holder = (TopSitesViewHolder) v.getTag(); final String title = data.getStringExtra(AwesomeBar.TITLE_KEY);
--- a/mobile/android/base/AboutHomePromoBox.java +++ b/mobile/android/base/AboutHomePromoBox.java @@ -61,16 +61,17 @@ public class AboutHomePromoBox extends T } private class SyncType extends Type { private OnAccountsUpdateListener mAccountListener; public SyncType(int aText, int aBoldText, int aImage) { super(aText, aBoldText, aImage); // The listener will run on the background thread (see 2nd argument) mAccountListener = new OnAccountsUpdateListener() { + @Override public void onAccountsUpdated(Account[] accounts) { showRandomPromo(); } }; AccountManager.get(mContext).addOnAccountsUpdatedListener(mAccountListener, GeckoAppShell.getHandler(), false); } @Override public boolean canShow() { @@ -120,16 +121,17 @@ public class AboutHomePromoBox extends T @Override public void onClick(View v) { Tabs.getInstance().loadUrl("https://marketplace.firefox.com/", Tabs.LOADURL_NEW_TAB); // this isn't as good as being notified whenever this url is added to the database, // if the user visits the marketplace through some other means, we'll have to wait // until we are refreshed or restarted to get the correct value v.postDelayed(new Runnable() { + @Override public void run() { showRandomPromo(); } }, 5000); } }); } @@ -144,16 +146,17 @@ public class AboutHomePromoBox extends T } /** * Shows the specified promo box. If a promo box is already active, it will be overidden with a * promo box of the specified type. */ public void showRandomPromo() { getAvailableTypes(new GetTypesCallback() { + @Override public void onGotTypes(ArrayList<Type> types) { if (types.size() == 0) { hide(); return; } // Try to maintain a promo type for the lifetime of the application if (AboutHomePromoBox.sTypeIndex == -1 || AboutHomePromoBox.sTypeIndex >= types.size()) {
--- a/mobile/android/base/ActivityHandlerHelper.java +++ b/mobile/android/base/ActivityHandlerHelper.java @@ -235,13 +235,14 @@ class ActivityHandlerHelper { private final String mTitle; private final PromptService.PromptListItem[] mItems; public FilePickerPromptRunnable(String aTitle, PromptService.PromptListItem[] aItems) { mTitle = aTitle; mItems = aItems; } + @Override public void run() { GeckoApp.mAppContext.getPromptService().show(mTitle, "", mItems, false); } } }
--- a/mobile/android/base/AndroidImportPreference.java +++ b/mobile/android/base/AndroidImportPreference.java @@ -69,28 +69,31 @@ class AndroidImportPreference extends Mu final ProgressDialog dialog = ProgressDialog.show(mContext, dialogTitle, mContext.getString(R.string.bookmarkhistory_import_wait), true); final Runnable stopCallback = new Runnable() { + @Override public void run() { GeckoApp.mAppContext.runOnUiThread(new Runnable() { + @Override public void run() { dialog.dismiss(); } }); } }; GeckoBackgroundThread.getHandler().post( // Constructing AndroidImport may need finding the profile, // which hits disk, so it needs to go into a Runnable too. new Runnable() { + @Override public void run() { new AndroidImport(mContext, stopCallback, doBookmarks, doHistory).run(); } } ); } }
--- a/mobile/android/base/AnimatedHeightLayout.java +++ b/mobile/android/base/AnimatedHeightLayout.java @@ -29,20 +29,24 @@ public class AnimatedHeightLayout extend mAnimating = true; setMeasuredDimension(getMeasuredWidth(), oldHeight); // Animate the difference of suggestion row height Animation anim = new HeightChangeAnimation(this, oldHeight, newHeight); anim.setDuration(ANIMATION_DURATION); anim.setInterpolator(new DecelerateInterpolator()); anim.setAnimationListener(new Animation.AnimationListener() { + @Override public void onAnimationStart(Animation animation) {} + @Override public void onAnimationRepeat(Animation animation) {} + @Override public void onAnimationEnd(Animation animation) { post(new Runnable() { + @Override public void run() { finishAnimation(); } }); } }); startAnimation(anim); }
--- a/mobile/android/base/AwesomeBar.java +++ b/mobile/android/base/AwesomeBar.java @@ -83,38 +83,43 @@ public class AwesomeBar extends GeckoAct mGoButton = (ImageButton) findViewById(R.id.awesomebar_button); mText = (CustomEditText) findViewById(R.id.awesomebar_text); TabWidget tabWidget = (TabWidget) findViewById(android.R.id.tabs); tabWidget.setDividerDrawable(null); mAwesomeTabs = (AwesomeBarTabs) findViewById(R.id.awesomebar_tabs); mAwesomeTabs.setOnUrlOpenListener(new AwesomeBarTabs.OnUrlOpenListener() { + @Override public void onUrlOpen(String url, String title) { openUrlAndFinish(url, title, false); } + @Override public void onSearch(String engine, String text) { openSearchAndFinish(text, engine); } + @Override public void onEditSuggestion(final String text) { GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { mText.setText(text); mText.setSelection(mText.getText().length()); mText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mText, InputMethodManager.SHOW_IMPLICIT); } }); } }); mGoButton.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View v) { openUserEnteredAndFinish(mText.getText().toString()); } }); Intent intent = getIntent(); String currentUrl = intent.getStringExtra(CURRENT_URL_KEY); if (currentUrl != null) { @@ -134,16 +139,17 @@ public class AwesomeBar extends GeckoAct mTabs.setPrivateMode(true); mText.setPrivateMode(true); } } mAwesomeTabs.setTarget(mTarget); mText.setOnKeyPreImeListener(new CustomEditText.OnKeyPreImeListener() { + @Override public boolean onKeyPreIme(View v, int keyCode, KeyEvent event) { // We only want to process one event per tap if (event.getAction() != KeyEvent.ACTION_DOWN) return false; if (keyCode == KeyEvent.KEYCODE_ENTER) { // If the AwesomeBar has a composition string, don't submit the text yet. // ENTER is needed to commit the composition string. @@ -170,57 +176,62 @@ public class AwesomeBar extends GeckoAct return true; } return false; } }); mText.addTextChangedListener(new TextWatcher() { + @Override public void afterTextChanged(Editable s) { String text = s.toString(); mAwesomeTabs.filter(text); // If the AwesomeBar has a composition string, don't call updateGoButton(). // That method resets IME and composition state will be broken. if (!hasCompositionString(s)) { updateGoButton(text); } if (Build.VERSION.SDK_INT >= 11) { getActionBar().hide(); } } + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // do nothing } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // do nothing } }); mText.setOnKeyListener(new View.OnKeyListener() { + @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { if (event.getAction() != KeyEvent.ACTION_DOWN) return true; openUserEnteredAndFinish(mText.getText().toString()); return true; } else { return false; } } }); mText.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override public void onFocusChange(View v, boolean hasFocus) { if (v == null || hasFocus) { return; } InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); try { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); @@ -560,16 +571,17 @@ public class AwesomeBar extends GeckoAct final EditText nameText = ((EditText) editView.findViewById(R.id.edit_bookmark_name)); final EditText locationText = ((EditText) editView.findViewById(R.id.edit_bookmark_location)); final EditText keywordText = ((EditText) editView.findViewById(R.id.edit_bookmark_keyword)); nameText.setText(title); locationText.setText(url); keywordText.setText(keyword); editPrompt.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int whichButton) { (new UiAsyncTask<Void, Void, Void>(GeckoAppShell.getHandler()) { @Override public Void doInBackground(Void... params) { String newUrl = locationText.getText().toString().trim(); BrowserDB.updateBookmark(getContentResolver(), id, newUrl, nameText.getText().toString(), keywordText.getText().toString()); return null; @@ -579,31 +591,35 @@ public class AwesomeBar extends GeckoAct public void onPostExecute(Void result) { Toast.makeText(AwesomeBar.this, R.string.bookmark_updated, Toast.LENGTH_SHORT).show(); } }).execute(); } }); editPrompt.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { + @Override + public void onClick(DialogInterface dialog, int whichButton) { // do nothing } }); final AlertDialog dialog = editPrompt.create(); // disable OK button if the URL is empty locationText.addTextChangedListener(new TextWatcher() { private boolean mEnabled = true; + @Override public void afterTextChanged(Editable s) {} + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { boolean enabled = (s.toString().trim().length() > 0); if (mEnabled != enabled) { dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(enabled); mEnabled = enabled; } } });
--- a/mobile/android/base/AwesomeBarTabs.java +++ b/mobile/android/base/AwesomeBarTabs.java @@ -125,16 +125,17 @@ public class AwesomeBarTabs extends TabH mInflated = true; // This should be called before adding any tabs // to the TabHost. setup(); mListTouchListener = new View.OnTouchListener() { + @Override public boolean onTouch(View view, MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) hideSoftInput(view); return false; } }; mTabs = new AwesomeBarTab[] { @@ -259,16 +260,17 @@ public class AwesomeBarTabs extends TabH GeckoTextView indicatorView = (GeckoTextView) mInflater.inflate(R.layout.awesomebar_tab_indicator, null); indicatorView.setText(titleId); getTabWidget().addView(indicatorView); // this MUST be done after tw.addView to overwrite the listener added by tabWidget // which delegates to TabHost (which we don't have) indicatorView.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { mViewPager.setCurrentItem(contentId, true); } }); return indicatorView; }
--- a/mobile/android/base/AwesomebarResultHandler.java +++ b/mobile/android/base/AwesomebarResultHandler.java @@ -6,16 +6,17 @@ package org.mozilla.gecko; import org.mozilla.gecko.util.ActivityResultHandler; import android.content.Intent; class AwesomebarResultHandler implements ActivityResultHandler { private static final String LOGTAG = "GeckoAwesomebarResultHandler"; + @Override public void onActivityResult(int resultCode, Intent data) { if (data != null) { String url = data.getStringExtra(AwesomeBar.URL_KEY); AwesomeBar.Target target = AwesomeBar.Target.valueOf(data.getStringExtra(AwesomeBar.TARGET_KEY)); String searchEngine = data.getStringExtra(AwesomeBar.SEARCH_KEY); if (url != null && url.length() > 0) { int flags = Tabs.LOADURL_NONE; if (target == AwesomeBar.Target.NEW_TAB) {
--- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -70,16 +70,17 @@ abstract public class BrowserApp extends public int parent; } private Vector<MenuItemInfo> mAddonMenuItemsCache; private PropertyAnimator mMainLayoutAnimator; private static final Interpolator sTabsInterpolator = new Interpolator() { + @Override public float getInterpolation(float t) { t -= 1.0f; return t * t * t * t * t + 1.0f; } }; private FindInPageBar mFindInPageBar; @@ -105,16 +106,17 @@ abstract public class BrowserApp extends SiteIdentityPopup.getInstance().dismiss(); final TabsPanel.Panel panel = tab.isPrivate() ? TabsPanel.Panel.PRIVATE_TABS : TabsPanel.Panel.NORMAL_TABS; // Delay calling showTabs so that it does not modify the mTabsChangedListeners // array while we are still iterating through the array. mMainHandler.post(new Runnable() { + @Override public void run() { if (areTabsShown() && mTabsPanel.getCurrentPanel() != panel) showTabs(panel); } }); } break; case LOAD_ERROR: @@ -149,35 +151,38 @@ abstract public class BrowserApp extends void handleReaderAdded(boolean success, final String title, final String url) { if (!success) { showToast(R.string.reading_list_failed, Toast.LENGTH_SHORT); return; } GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { BrowserDB.addReadingListItem(getContentResolver(), title, url); showToast(R.string.reading_list_added, Toast.LENGTH_SHORT); } }); } void handleReaderRemoved(final String url) { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { BrowserDB.removeReadingListItemWithURL(getContentResolver(), url); showToast(R.string.reading_list_removed, Toast.LENGTH_SHORT); } }); } @Override void onStatePurged() { mMainHandler.post(new Runnable() { + @Override public void run() { if (mAboutHomeContent != null) mAboutHomeContent.setLastTabsVisibility(false); } }); super.onStatePurged(); } @@ -271,16 +276,17 @@ abstract public class BrowserApp extends Tabs.getInstance().loadUrl(uri, flags); } } } @Override void toggleChrome(final boolean aShow) { mMainHandler.post(new Runnable() { + @Override public void run() { if (aShow) { mBrowserToolbar.show(); } else { mBrowserToolbar.hide(); if (hasTabsSideBar()) { hideTabs(); } @@ -289,16 +295,17 @@ abstract public class BrowserApp extends }); super.toggleChrome(aShow); } @Override void focusChrome() { mMainHandler.post(new Runnable() { + @Override public void run() { mBrowserToolbar.show(); mBrowserToolbar.requestFocusFromTouch(); } }); } @Override @@ -416,31 +423,34 @@ abstract public class BrowserApp extends try { info.checkable = message.getBoolean("checkable"); } catch (Exception ex) { } try { // parent is optional info.parent = message.getInt("parent") + ADDON_MENU_OFFSET; } catch (Exception ex) { } final MenuItemInfo menuItemInfo = info; mMainHandler.post(new Runnable() { + @Override public void run() { addAddonMenuItem(menuItemInfo); } }); } else if (event.equals("Menu:Remove")) { final int id = message.getInt("id") + ADDON_MENU_OFFSET; mMainHandler.post(new Runnable() { + @Override public void run() { removeAddonMenuItem(id); } }); } else if (event.equals("Menu:Update")) { final int id = message.getInt("id") + ADDON_MENU_OFFSET; final JSONObject options = message.getJSONObject("options"); mMainHandler.post(new Runnable() { + @Override public void run() { updateAddonMenuItem(id, options); } }); } else if (event.equals("CharEncoding:Data")) { final JSONArray charsets = message.getJSONArray("charsets"); int selected = message.getInt("selected"); @@ -448,41 +458,45 @@ abstract public class BrowserApp extends final String[] titleArray = new String[len]; for (int i = 0; i < len; i++) { JSONObject charset = charsets.getJSONObject(i); titleArray[i] = charset.getString("title"); } final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setSingleChoiceItems(titleArray, selected, new AlertDialog.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { try { JSONObject charset = charsets.getJSONObject(which); GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("CharEncoding:Set", charset.getString("code"))); dialog.dismiss(); } catch (JSONException e) { Log.e(LOGTAG, "error parsing json", e); } } }); dialogBuilder.setNegativeButton(R.string.button_cancel, new AlertDialog.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); mMainHandler.post(new Runnable() { + @Override public void run() { dialogBuilder.show(); } }); } else if (event.equals("CharEncoding:State")) { final boolean visible = message.getString("visible").equals("true"); GeckoPreferences.setCharEncodingState(visible); final Menu menu = mMenu; mMainHandler.post(new Runnable() { + @Override public void run() { if (menu != null) menu.findItem(R.id.char_encoding).setVisible(visible); } }); } else if (event.equals("Feedback:OpenPlayStore")) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("market://details?id=" + getPackageName())); @@ -492,16 +506,17 @@ abstract public class BrowserApp extends } else if (event.equals("Feedback:LastUrl")) { getLastUrl(); } else if (event.equals("Gecko:Ready")) { // Handle this message in GeckoApp, but also enable the Settings // menuitem, which is specific to BrowserApp. super.handleMessage(event, message); final Menu menu = mMenu; mMainHandler.post(new Runnable() { + @Override public void run() { if (menu != null) menu.findItem(R.id.settings).setEnabled(true); } }); } else if (event.equals("Telemetry:Gather")) { Telemetry.HistogramAdd("PLACES_PAGES_COUNT", BrowserDB.getCount(getContentResolver(), "history")); Telemetry.HistogramAdd("PLACES_BOOKMARKS_COUNT", BrowserDB.getCount(getContentResolver(), "bookmarks")); @@ -658,16 +673,17 @@ abstract public class BrowserApp extends /* Favicon methods */ private void loadFavicon(final Tab tab) { maybeCancelFaviconLoad(tab); long id = Favicons.getInstance().loadFavicon(tab.getURL(), tab.getFaviconURL(), !tab.isPrivate(), new Favicons.OnFaviconLoadedListener() { + @Override public void onFaviconLoaded(String pageUrl, Bitmap favicon) { // Leave favicon UI untouched if we failed to load the image // for some reason. if (favicon == null) return; // The tab might be pointing to another URL by the time the // favicon is finally loaded, in which case we simply ignore it. @@ -730,29 +746,32 @@ abstract public class BrowserApp extends } private class AboutHomeRunnable implements Runnable { boolean mShow; AboutHomeRunnable(boolean show) { mShow = show; } + @Override public void run() { if (mShow) { if (mAboutHomeContent == null) { mAboutHomeContent = (AboutHomeContent) findViewById(R.id.abouthome_content); mAboutHomeContent.init(); mAboutHomeContent.update(AboutHomeContent.UpdateFlags.ALL); mAboutHomeContent.setUriLoadCallback(new AboutHomeContent.UriLoadCallback() { + @Override public void callback(String url) { mBrowserToolbar.setProgressVisibility(true); Tabs.getInstance().loadUrl(url); } }); mAboutHomeContent.setLoadCompleteCallback(new AboutHomeContent.VoidCallback() { + @Override public void callback() { mAboutHomeStartupTimer.stop(); } }); } else { mAboutHomeContent.update(EnumSet.of(AboutHomeContent.UpdateFlags.TOP_SITES, AboutHomeContent.UpdateFlags.REMOTE_TABS)); } @@ -847,16 +866,17 @@ abstract public class BrowserApp extends if (info.icon != null) { if (info.icon.startsWith("data")) { BitmapDrawable drawable = new BitmapDrawable(BitmapUtils.getBitmapFromDataURI(info.icon)); item.setIcon(drawable); } else if (info.icon.startsWith("jar:") || info.icon.startsWith("file://")) { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { try { URL url = new URL(info.icon); InputStream is = (InputStream) url.getContent(); try { Drawable drawable = Drawable.createFromStream(is, "src"); item.setIcon(drawable); } finally { @@ -986,25 +1006,26 @@ abstract public class BrowserApp extends @Override public void closeOptionsMenu() { if (!mBrowserToolbar.closeOptionsMenu()) super.closeOptionsMenu(); } @Override public void setFullScreen(final boolean fullscreen) { - super.setFullScreen(fullscreen); - mMainHandler.post(new Runnable() { - public void run() { - if (fullscreen) - mBrowserToolbar.hide(); - else - mBrowserToolbar.show(); - } - }); + super.setFullScreen(fullscreen); + mMainHandler.post(new Runnable() { + @Override + public void run() { + if (fullscreen) + mBrowserToolbar.hide(); + else + mBrowserToolbar.show(); + } + }); } @Override public boolean onPrepareOptionsMenu(Menu aMenu) { if (aMenu == null) return false; if (!GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning))
--- a/mobile/android/base/BrowserToolbar.java +++ b/mobile/android/base/BrowserToolbar.java @@ -122,16 +122,17 @@ public class BrowserToolbar implements V public void from(LinearLayout layout) { if (mLayout != null) { // make sure we retain the visibility property on rotation layout.setVisibility(mLayout.getVisibility()); } mLayout = layout; mLayout.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { } }); mShowSiteSecurity = false; mShowReader = false; mAddressBarBg = (BrowserToolbarBackground) mLayout.findViewById(R.id.address_bar_bg); @@ -148,22 +149,24 @@ public class BrowserToolbar implements V mTitle = (GeckoTextView) mLayout.findViewById(R.id.awesome_bar_title); mTitlePadding = mTitle.getPaddingRight(); if (Build.VERSION.SDK_INT >= 16) mTitle.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); mAwesomeBar = mLayout.findViewById(R.id.awesome_bar); mAwesomeBar.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View v) { mActivity.autoHideTabs(); onAwesomeBarSearch(); } }); mAwesomeBar.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflater = mActivity.getMenuInflater(); inflater.inflate(R.menu.titlebar_contextmenu, menu); String clipboard = GeckoAppShell.getClipboardText(); if (clipboard == null || TextUtils.isEmpty(clipboard)) { menu.findItem(R.id.pasteandgo).setVisible(false); menu.findItem(R.id.paste).setVisible(false); @@ -183,16 +186,17 @@ public class BrowserToolbar implements V menu.findItem(R.id.share).setVisible(false); menu.findItem(R.id.add_to_launcher).setVisible(false); } } }); mTabs = (TabsButton) mLayout.findViewById(R.id.tabs); mTabs.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View v) { toggleTabs(); } }); mTabs.setImageLevel(0); mTabsCount = (GeckoTextSwitcher) mLayout.findViewById(R.id.tabs_count); mTabsCount.removeAllViews(); @@ -208,40 +212,45 @@ public class BrowserToolbar implements V mTabsCount.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); mTabsCount.setAccessibilityDelegate(new View.AccessibilityDelegate() { public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {} }); } mBack = (ImageButton) mLayout.findViewById(R.id.back); mBack.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View view) { Tabs.getInstance().getSelectedTab().doBack(); } }); mBack.setOnLongClickListener(new Button.OnLongClickListener() { + @Override public boolean onLongClick(View view) { return Tabs.getInstance().getSelectedTab().showBackHistory(); } }); mForward = (ImageButton) mLayout.findViewById(R.id.forward); mForward.setEnabled(false); // initialize the forward button to not be enabled mForward.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View view) { Tabs.getInstance().getSelectedTab().doForward(); } }); mForward.setOnLongClickListener(new Button.OnLongClickListener() { + @Override public boolean onLongClick(View view) { return Tabs.getInstance().getSelectedTab().showForwardHistory(); } }); Button.OnClickListener faviconListener = new Button.OnClickListener() { + @Override public void onClick(View view) { if (mSiteSecurity.getVisibility() != View.VISIBLE) return; SiteIdentityPopup.getInstance().show(mSiteSecurity); } }; @@ -254,26 +263,28 @@ public class BrowserToolbar implements V mSiteSecurity = (ImageButton) mLayout.findViewById(R.id.site_security); mSiteSecurity.setOnClickListener(faviconListener); mSiteSecurityVisible = (mSiteSecurity.getVisibility() == View.VISIBLE); mProgressSpinner = (AnimationDrawable) mActivity.getResources().getDrawable(R.drawable.progress_spinner); mStop = (ImageButton) mLayout.findViewById(R.id.stop); mStop.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View v) { Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null) tab.doStop(); setProgressVisibility(false); } }); mReader = (ImageButton) mLayout.findViewById(R.id.reader); mReader.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View view) { Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null) tab.readerMode(); } }); mShadow = (ImageView) mLayout.findViewById(R.id.shadow); @@ -312,16 +323,17 @@ public class BrowserToolbar implements V mMenu = (GeckoImageButton) mLayout.findViewById(R.id.menu); mActionItemBar = (LinearLayout) mLayout.findViewById(R.id.menu_items); mHasSoftMenuButton = !mActivity.hasPermanentMenuKey(); if (mHasSoftMenuButton) { mMenu.setVisibility(View.VISIBLE); mMenu.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View view) { mActivity.openOptionsMenu(); } }); // Set a touch delegate to Tabs button, so the touch events on its tail // are passed to the menu button. mLayout.post(new Runnable() { @@ -348,16 +360,17 @@ public class BrowserToolbar implements V mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, null); panel = mActivity.getMenuPanel(); if (mHasSoftMenuButton) { mMenuPopup = new MenuPopup(mActivity); mMenuPopup.setPanelView(panel); mMenuPopup.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override public void onDismiss() { mActivity.onOptionsMenuClosed(null); } }); } } } @@ -370,16 +383,17 @@ public class BrowserToolbar implements V public void refreshBackground() { mAddressBarBg.requestLayout(); if (mAwesomeBarRightEdge != null) mAwesomeBarRightEdge.requestLayout(); } + @Override public void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { switch(msg) { case TITLE: if (Tabs.getInstance().isSelectedTab(tab)) { setTitle(tab.getDisplayTitle()); } break; case START: @@ -625,16 +639,17 @@ public class BrowserToolbar implements V PropertyAnimator.Property.ALPHA, 1); buttonsAnimator.start(); } }); mHandler.postDelayed(new Runnable() { + @Override public void run() { contentAnimator.start(); } }, 500); } private void onAwesomeBarSearch() { // This animation doesn't make much sense in a sidebar UI @@ -743,23 +758,25 @@ public class BrowserToolbar implements V } mTabsCount.setText(String.valueOf(count)); mTabs.setContentDescription((count > 1) ? mActivity.getString(R.string.num_tabs, count) : mActivity.getString(R.string.one_tab)); mCount = count; mHandler.postDelayed(new Runnable() { + @Override public void run() { GeckoTextView view = (GeckoTextView) mTabsCount.getCurrentView(); view.setSelected(true); } }, mDuration); mHandler.postDelayed(new Runnable() { + @Override public void run() { GeckoTextView view = (GeckoTextView) mTabsCount.getCurrentView(); view.setSelected(false); } }, 2 * mDuration); } public void updateTabCount(int count) {
--- a/mobile/android/base/CameraImageResultHandler.java +++ b/mobile/android/base/CameraImageResultHandler.java @@ -19,16 +19,17 @@ class CameraImageResultHandler implement private static final String LOGTAG = "GeckoCameraImageResultHandler"; private final SynchronousQueue<String> mFilePickerResult; CameraImageResultHandler(SynchronousQueue<String> resultQueue) { mFilePickerResult = resultQueue; } + @Override public void onActivityResult(int resultCode, Intent data) { try { if (resultCode != Activity.RESULT_OK) { mFilePickerResult.put(""); return; } File file = new File(Environment.getExternalStorageDirectory(), sImageName);
--- a/mobile/android/base/CameraVideoResultHandler.java +++ b/mobile/android/base/CameraVideoResultHandler.java @@ -18,16 +18,17 @@ class CameraVideoResultHandler implement private static final String LOGTAG = "GeckoCameraVideoResultHandler"; private final SynchronousQueue<String> mFilePickerResult; CameraVideoResultHandler(SynchronousQueue<String> resultQueue) { mFilePickerResult = resultQueue; } + @Override public void onActivityResult(int resultCode, Intent data) { try { if (data == null || resultCode != Activity.RESULT_OK) { mFilePickerResult.put(""); return; } Cursor cursor = GeckoApp.mAppContext.managedQuery(data.getData(),
--- a/mobile/android/base/CheckableLinearLayout.java +++ b/mobile/android/base/CheckableLinearLayout.java @@ -10,25 +10,28 @@ import android.widget.LinearLayout; public class CheckableLinearLayout extends LinearLayout implements Checkable { private CheckBox mCheckBox; public CheckableLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } + @Override public boolean isChecked() { return mCheckBox != null ? mCheckBox.isChecked() : false; } + @Override public void setChecked(boolean isChecked) { if (mCheckBox != null) mCheckBox.setChecked(isChecked); } + @Override public void toggle() { if (mCheckBox != null) mCheckBox.toggle(); } @Override protected void onFinishInflate() { super.onFinishInflate();
--- a/mobile/android/base/CrashReporter.java.in +++ b/mobile/android/base/CrashReporter.java.in @@ -79,16 +79,17 @@ public class CrashReporter extends Activ return false; } return true; } private void doFinish() { if (mHandler != null) { mHandler.post(new Runnable() { + @Override public void run() { finish(); } }); } } @Override @@ -142,16 +143,17 @@ public class CrashReporter extends Activ final CheckBox sendReportCheckbox = (CheckBox) findViewById(R.id.send_report); if (!sendReportCheckbox.isChecked()) { doFinish(); return; } mProgressDialog.show(); new Thread(new Runnable() { + @Override public void run() { sendReport(mPendingMinidumpFile, mExtrasStringMap, mPendingExtrasFile); } }, "CrashReporter Thread").start(); } public void onCloseClick(View v) { // bound via crash_reporter.xml backgroundSendReport();
--- a/mobile/android/base/Distribution.java +++ b/mobile/android/base/Distribution.java @@ -42,16 +42,17 @@ public final class Distribution { /** * Initializes distribution if it hasn't already been initalized. * * @param packagePath specifies where to look for the distribution directory. */ public static void init(final Context context, final String packagePath) { // Read/write preferences and files on the background thread. GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { // Bail if we've already initialized the distribution. SharedPreferences settings = context.getSharedPreferences(GeckoApp.PREFS_NAME, Activity.MODE_PRIVATE); String keyName = context.getPackageName() + ".distribution_state"; int state = settings.getInt(keyName, STATE_UNKNOWN); if (state == STATE_NONE) { return; }
--- a/mobile/android/base/DoorHanger.java +++ b/mobile/android/base/DoorHanger.java @@ -101,16 +101,17 @@ public class DoorHanger extends LinearLa Button mButton = new Button(mActivity); mButton.setText(aText); mButton.setTag(Integer.toString(aCallback)); mButton.setOnClickListener(this); mChoicesLayout.addView(mButton, mLayoutParams); } + @Override public void onClick(View v) { JSONObject response = new JSONObject(); try { response.put("callback", v.getTag().toString()); // If the checkbox is being used, pass its value if (mCheckBox != null) response.put("checked", mCheckBox.isChecked());
--- a/mobile/android/base/DoorHangerPopup.java +++ b/mobile/android/base/DoorHangerPopup.java @@ -58,51 +58,55 @@ public class DoorHangerPopup extends Pop unregisterEventListener("Doorhanger:Remove"); Tabs.unregisterOnTabsChangedListener(this); } void setAnchor(View aAnchor) { mAnchor = aAnchor; } + @Override public void handleMessage(String event, JSONObject geckoObject) { try { if (event.equals("Doorhanger:Add")) { final int tabId = geckoObject.getInt("tabID"); final String value = geckoObject.getString("value"); final String message = geckoObject.getString("message"); final JSONArray buttons = geckoObject.getJSONArray("buttons"); final JSONObject options = geckoObject.getJSONObject("options"); mActivity.runOnUiThread(new Runnable() { + @Override public void run() { addDoorHanger(tabId, value, message, buttons, options); } }); } else if (event.equals("Doorhanger:Remove")) { final int tabId = geckoObject.getInt("tabID"); final String value = geckoObject.getString("value"); mActivity.runOnUiThread(new Runnable() { + @Override public void run() { DoorHanger doorHanger = getDoorHanger(tabId, value); if (doorHanger == null) return; removeDoorHanger(doorHanger); updatePopup(); } }); } } catch (Exception e) { Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); } } // This callback is automatically executed on the UI thread. + @Override public void onTabChanged(final Tab tab, final Tabs.TabEvents msg, final Object data) { switch(msg) { case CLOSED: // Remove any doorhangers for a tab when it's closed (make // a temporary set to avoid a ConcurrentModificationException) HashSet<DoorHanger> doorHangersToRemove = new HashSet<DoorHanger>(); for (DoorHanger dh : mDoorHangers) { if (dh.getTabId() == tab.getId())
--- a/mobile/android/base/Favicons.java +++ b/mobile/android/base/Favicons.java @@ -80,16 +80,17 @@ public class Favicons { private void dispatchResult(final String pageUrl, final Bitmap image, final OnFaviconLoadedListener listener) { if (pageUrl != null && image != null) putFaviconInMemCache(pageUrl, image); // We want to always run the listener on UI thread GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { if (listener != null) listener.onFaviconLoaded(pageUrl, image); } }); } public String getFaviconUrlForPageUrl(String pageUrl) {
--- a/mobile/android/base/FilePickerResultHandlerSync.java +++ b/mobile/android/base/FilePickerResultHandlerSync.java @@ -11,16 +11,17 @@ import java.util.concurrent.SynchronousQ class FilePickerResultHandlerSync extends FilePickerResultHandler { private static final String LOGTAG = "GeckoFilePickerResultHandlerSync"; FilePickerResultHandlerSync(SynchronousQueue<String> resultQueue) { super(resultQueue); } + @Override public void onActivityResult(int resultCode, Intent data) { try { mFilePickerResult.put(handleActivityResult(resultCode, data)); } catch (InterruptedException e) { Log.i(LOGTAG, "error returning file picker result", e); } } }
--- a/mobile/android/base/FindInPageBar.java +++ b/mobile/android/base/FindInPageBar.java @@ -37,16 +37,17 @@ public class FindInPageBar extends Relat // Capture clicks on the rest of the view to prevent them from // leaking into other views positioned below. content.setOnClickListener(this); mFindText = (CustomEditText) content.findViewById(R.id.find_text); mFindText.addTextChangedListener(this); mFindText.setOnKeyPreImeListener(new CustomEditText.OnKeyPreImeListener() { + @Override public boolean onKeyPreIme(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { hide(); return true; } return false; } }); @@ -62,17 +63,18 @@ public class FindInPageBar extends Relat mFindText.requestFocus(); // Show the virtual keyboard. if (mFindText.hasWindowFocus()) { getInputMethodManager(mFindText).showSoftInput(mFindText, 0); } else { // showSoftInput won't work until after the window is focused. mFindText.setOnWindowFocusChangeListener(new CustomEditText.OnWindowFocusChangeListener() { - public void onWindowFocusChanged(boolean hasFocus) { + @Override + public void onWindowFocusChanged(boolean hasFocus) { if (!hasFocus) return; mFindText.setOnWindowFocusChangeListener(null); getInputMethodManager(mFindText).showSoftInput(mFindText, 0); } }); } } @@ -85,30 +87,34 @@ public class FindInPageBar extends Relat private InputMethodManager getInputMethodManager(View view) { Context context = view.getContext(); return (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); } // TextWatcher implementation + @Override public void afterTextChanged(Editable s) { GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FindInPage:Find", s.toString())); } + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // ignore } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // ignore } // View.OnClickListener implementation + @Override public void onClick(View v) { switch (v.getId()) { case R.id.find_prev: GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FindInPage:Prev", mFindText.getText().toString())); getInputMethodManager(mFindText).hideSoftInputFromWindow(mFindText.getWindowToken(), 0); break; case R.id.find_next: GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("FindInPage:Next", mFindText.getText().toString()));
--- a/mobile/android/base/FontSizePreference.java +++ b/mobile/android/base/FontSizePreference.java @@ -75,27 +75,29 @@ class FontSizePreference extends DialogP // Background cannot be set in XML (see bug 783597 - TODO: Change this to XML when bug is fixed). mScrollingContainer.setBackgroundColor(Color.WHITE); mPreviewFontView = (TextView) dialogView.findViewById(R.id.preview); mDecreaseFontButton = (Button) dialogView.findViewById(R.id.decrease_preview_font_button); mIncreaseFontButton = (Button) dialogView.findViewById(R.id.increase_preview_font_button); setButtonState(mPreviewFontIndex); mDecreaseFontButton.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { mPreviewFontIndex = Math.max(mPreviewFontIndex - 1, 0); updatePreviewFontSize(mFontTwipValues[mPreviewFontIndex]); mIncreaseFontButton.setEnabled(true); // If we reached the minimum index, disable the button. if (mPreviewFontIndex == 0) { mDecreaseFontButton.setEnabled(false); } } }); mIncreaseFontButton.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(View v) { mPreviewFontIndex = Math.min(mPreviewFontIndex + 1, mFontTwipValues.length - 1); updatePreviewFontSize(mFontTwipValues[mPreviewFontIndex]); mDecreaseFontButton.setEnabled(true); // If we reached the maximum index, disable the button. if (mPreviewFontIndex == mFontTwipValues.length - 1) { mIncreaseFontButton.setEnabled(false);
--- a/mobile/android/base/FormAssistPopup.java +++ b/mobile/android/base/FormAssistPopup.java @@ -77,16 +77,17 @@ public class FormAssistPopup extends Rel } void destroy() { unregisterEventListener("FormAssist:AutoComplete"); unregisterEventListener("FormAssist:ValidationMessage"); unregisterEventListener("FormAssist:Hide"); } + @Override public void handleMessage(String event, JSONObject message) { try { if (event.equals("FormAssist:AutoComplete")) { handleAutoCompleteMessage(message); } else if (event.equals("FormAssist:ValidationMessage")) { handleValidationMessage(message); } else if (event.equals("FormAssist:Hide")) { handleHideMessage(message); @@ -96,47 +97,51 @@ public class FormAssistPopup extends Rel } } private void handleAutoCompleteMessage(JSONObject message) throws JSONException { final JSONArray suggestions = message.getJSONArray("suggestions"); final JSONArray rect = message.getJSONArray("rect"); final double zoom = message.getDouble("zoom"); GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { showAutoCompleteSuggestions(suggestions, rect, zoom); } }); } private void handleValidationMessage(JSONObject message) throws JSONException { final String validationMessage = message.getString("validationMessage"); final JSONArray rect = message.getJSONArray("rect"); final double zoom = message.getDouble("zoom"); GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { showValidationMessage(validationMessage, rect, zoom); } }); } private void handleHideMessage(JSONObject message) { GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { hide(); } }); } private void showAutoCompleteSuggestions(JSONArray suggestions, JSONArray rect, double zoom) { if (mAutoCompleteList == null) { LayoutInflater inflater = LayoutInflater.from(mContext); mAutoCompleteList = (ListView) inflater.inflate(R.layout.autocomplete_list, null); mAutoCompleteList.setOnItemClickListener(new OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parentView, View view, int position, long id) { // Use the value stored with the autocomplete view, not the label text, // since they can be different. TextView textView = (TextView) view; String value = (String) textView.getTag(); broadcastGeckoEvent("FormAssist:AutoComplete", value); hide(); }
--- a/mobile/android/base/GeckoAccessibility.java +++ b/mobile/android/base/GeckoAccessibility.java @@ -38,16 +38,17 @@ public class GeckoAccessibility { "com.google.android.marvin.talkback.TalkBackService", // Google Talkback screen reader "com.mot.readout.ScreenReader", // Motorola screen reader "info.spielproject.spiel.SpielService", // Spiel screen reader "es.codefactory.android.app.ma.MAAccessibilityService" // Codefactory Mobile Accessibility screen reader })); public static void updateAccessibilitySettings () { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { JSONObject ret = new JSONObject(); sEnabled = false; AccessibilityManager accessibilityManager = (AccessibilityManager) GeckoApp.mAppContext.getSystemService(Context.ACCESSIBILITY_SERVICE); if (accessibilityManager.isEnabled()) { ActivityManager activityManager = (ActivityManager) GeckoApp.mAppContext.getSystemService(Context.ACTIVITY_SERVICE); @@ -124,16 +125,17 @@ public class GeckoAccessibility { Log.e(LOGTAG, "No accessibility event type provided"); return; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { // Before Jelly Bean we send events directly from here while spoofing the source by setting // the package and class name manually. GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { sendDirectAccessibilityEvent(eventType, message); } }); } else { // In Jelly Bean we populate an AccessibilityNodeInfo with the minimal amount of data to have // it work with TalkBack. final LayerView view = GeckoApp.mAppContext.getLayerView(); @@ -155,16 +157,17 @@ public class GeckoAccessibility { Rect screenBounds = new Rect(relativeBounds); screenBounds.offset(locationOnScreen[0], locationOnScreen[1]); sVirtualCursorNode.setBoundsInScreen(screenBounds); } // Store the JSON message and use it to populate the event later in the code path. sEventMessage = message; GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { // If this is an accessibility focus, a lot of internal voodoo happens so we perform an // accessibility focus action on the view, and it in turn sends the right events. switch (eventType) { case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: view.performAccessibilityAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); break; case AccessibilityEvent.TYPE_ANNOUNCEMENT:
--- a/mobile/android/base/GeckoActivity.java.in +++ b/mobile/android/base/GeckoActivity.java.in @@ -73,16 +73,17 @@ public class GeckoActivity extends Activ mGeckoActivityOpened = false; if (component != null && component.getPackageName() != null && component.getPackageName().equals("@ANDROID_PACKAGE_NAME@")) { mGeckoActivityOpened = true; } } + @Override public boolean isGeckoActivityOpened() { return mGeckoActivityOpened; } public boolean isApplicationInBackground() { return ((GeckoApplication) getApplication()).isApplicationInBackground(); }
--- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -192,16 +192,17 @@ abstract public class GeckoApp abstract public int getLayout(); abstract public boolean hasTabsSideBar(); abstract protected String getDefaultProfileName(); void toggleChrome(final boolean aShow) { } void focusChrome() { } + @Override public void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { // When a tab is closed, it is always unselected first. // When a tab is unselected, another tab is always selected first. switch(msg) { case UNSELECTED: hidePlugins(tab); break; @@ -733,16 +734,17 @@ abstract public class GeckoApp hasMenu = false; if (Build.VERSION.SDK_INT >= 14) hasMenu = ViewConfiguration.get(GeckoApp.mAppContext).hasPermanentMenuKey(); return hasMenu; } + @Override public void handleMessage(String event, JSONObject message) { try { if (event.equals("Toast:Show")) { final String msg = message.getString("message"); final String duration = message.getString("duration"); handleShowToast(msg, duration); } else if (event.equals("log")) { // generic log listener @@ -790,19 +792,21 @@ abstract public class GeckoApp layerView.setZoomConstraints(tab.getZoomConstraints()); } } else if (event.equals("Session:StatePurged")) { onStatePurged(); } else if (event.equals("Bookmark:Insert")) { final String url = message.getString("url"); final String title = message.getString("title"); mMainHandler.post(new Runnable() { + @Override public void run() { Toast.makeText(GeckoApp.mAppContext, R.string.bookmark_added, Toast.LENGTH_SHORT).show(); GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { BrowserDB.addBookmark(GeckoApp.mAppContext.getContentResolver(), title, url); } }); } }); } else if (event.equals("Accessibility:Event")) { GeckoAccessibility.sendAccessibilityEvent(message); @@ -854,16 +858,17 @@ abstract public class GeckoApp mPrivateBrowsingSession = message.getString("session"); } } } catch (Exception e) { Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); } } + @Override public String getResponse() { String res = mCurrentResponse; mCurrentResponse = ""; return res; } void onStatePurged() { } @@ -903,20 +908,22 @@ abstract public class GeckoApp // setSingleChoiceItems and changing the choiceMode below when we create the dialog builder.setSingleChoiceItems(new SimpleAdapter( GeckoApp.this, itemList, R.layout.site_setting_item, new String[] { "setting", "value" }, new int[] { R.id.setting, R.id.value } ), -1, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int id) { } }); builder.setPositiveButton(R.string.site_settings_clear, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int id) { ListView listView = ((AlertDialog) dialog).getListView(); SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions(); // An array of the indices of the permissions we want to clear JSONArray permissionsToClear = new JSONArray(); for (int i = 0; i < checkedItemPositions.size(); i++) if (checkedItemPositions.get(i)) @@ -924,22 +931,24 @@ abstract public class GeckoApp GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent( "Permissions:Clear", permissionsToClear.toString())); } }); } builder.setNegativeButton(R.string.site_settings_cancel, new DialogInterface.OnClickListener(){ + @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); mMainHandler.post(new Runnable() { + @Override public void run() { Dialog dialog = builder.create(); dialog.show(); ListView listView = ((AlertDialog) dialog).getListView(); if (listView != null) { listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); int listSize = listView.getAdapter().getCount(); @@ -947,24 +956,26 @@ abstract public class GeckoApp listView.setItemChecked(i, true); } } }); } public void showToast(final int resId, final int duration) { mMainHandler.post(new Runnable() { + @Override public void run() { Toast.makeText(mAppContext, resId, duration).show(); } }); } void handleShowToast(final String message, final String duration) { mMainHandler.post(new Runnable() { + @Override public void run() { Toast toast; if (duration.equals("long")) toast = Toast.makeText(mAppContext, message, Toast.LENGTH_LONG); else toast = Toast.makeText(mAppContext, message, Toast.LENGTH_SHORT); toast.show(); } @@ -996,16 +1007,17 @@ abstract public class GeckoApp FrameLayout decor = (FrameLayout)getWindow().getDecorView(); decor.addView(mFullScreenPluginContainer, layoutParams); mFullScreenPluginView = view; } void addPluginView(final View view, final Rect rect, final boolean isFullScreen) { mMainHandler.post(new Runnable() { + @Override public void run() { Tabs tabs = Tabs.getInstance(); Tab tab = tabs.getSelectedTab(); if (isFullScreen) { addFullScreenPluginView(view); return; } @@ -1035,32 +1047,34 @@ abstract public class GeckoApp return; } mFullScreenPluginContainer.removeView(mFullScreenPluginView); // We need do do this on the next iteration in order to avoid // a deadlock, see comment below in FullScreenHolder mMainHandler.post(new Runnable() { + @Override public void run() { mLayerView.show(); } }); FrameLayout decor = (FrameLayout)getWindow().getDecorView(); decor.removeView(mFullScreenPluginContainer); mFullScreenPluginView = null; GeckoScreenOrientationListener.getInstance().unlockScreenOrientation(); setFullScreen(false); } void removePluginView(final View view, final boolean isFullScreen) { mMainHandler.post(new Runnable() { + @Override public void run() { Tabs tabs = Tabs.getInstance(); Tab tab = tabs.getSelectedTab(); if (isFullScreen) { removeFullScreenPluginView(view); return; } @@ -1274,16 +1288,17 @@ abstract public class GeckoApp } } requestRender(); } public void setFullScreen(final boolean fullscreen) { mMainHandler.post(new Runnable() { + @Override public void run() { // Hide/show the system notification bar Window window = getWindow(); window.setFlags(fullscreen ? WindowManager.LayoutParams.FLAG_FULLSCREEN : 0, WindowManager.LayoutParams.FLAG_FULLSCREEN); if (Build.VERSION.SDK_INT >= 11) @@ -1399,16 +1414,17 @@ abstract public class GeckoApp if (!wasInBackground && !mIsRestoringActivity) { Telemetry.HistogramAdd("FENNEC_WAS_KILLED", 1); } mPrivateBrowsingSession = savedInstanceState.getString(SAVED_STATE_PRIVATE_SESSION); } GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { SharedPreferences prefs = GeckoApp.mAppContext.getSharedPreferences(PREFS_NAME, 0); boolean wasOOM = prefs.getBoolean(PREFS_OOM_EXCEPTION, false); boolean wasStopped = prefs.getBoolean(PREFS_WAS_STOPPED, true); if (wasOOM || !wasStopped) { Telemetry.HistogramAdd("FENNEC_WAS_KILLED", 1); @@ -1596,16 +1612,17 @@ abstract public class GeckoApp sGeckoThread = new GeckoThread(intent, passedUri); } if (!ACTION_DEBUG.equals(action) && GeckoThread.checkAndSetLaunchState(GeckoThread.LaunchState.Launching, GeckoThread.LaunchState.Launched)) { sGeckoThread.start(); } else if (ACTION_DEBUG.equals(action) && GeckoThread.checkAndSetLaunchState(GeckoThread.LaunchState.Launching, GeckoThread.LaunchState.WaitForDebugger)) { mMainHandler.postDelayed(new Runnable() { + @Override public void run() { GeckoThread.setLaunchState(GeckoThread.LaunchState.Launching); sGeckoThread.start(); } }, 1000 * 5 /* 5 seconds */); } //register for events @@ -1662,16 +1679,17 @@ abstract public class GeckoApp }); final GeckoApp self = this; // End of the startup of our Java App mJavaUiStartupTimer.stop(); GeckoAppShell.getHandler().postDelayed(new Runnable() { + @Override public void run() { // Sync settings need Gecko to be loaded, so // no hurry in starting this. checkMigrateSync(); // Record our launch time for the announcements service // to use in assessing inactivity. final Context context = GeckoApp.mAppContext; @@ -1905,16 +1923,17 @@ abstract public class GeckoApp } GeckoScreenOrientationListener.getInstance().start(); // User may have enabled/disabled accessibility. GeckoAccessibility.updateAccessibilitySettings(); GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { SharedPreferences prefs = GeckoApp.mAppContext.getSharedPreferences(GeckoApp.PREFS_NAME, 0); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(GeckoApp.PREFS_WAS_STOPPED, false); editor.commit(); } }); @@ -1950,16 +1969,17 @@ abstract public class GeckoApp @Override public void onPause() { // In some way it's sad that Android will trigger StrictMode warnings // here as the whole point is to save to disk while the activity is not // interacting with the user. GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { SharedPreferences prefs = GeckoApp.mAppContext.getSharedPreferences(GeckoApp.PREFS_NAME, 0); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(GeckoApp.PREFS_WAS_STOPPED, true); editor.commit(); BrowserDB.expireHistory(getContentResolver(), @@ -1971,16 +1991,17 @@ abstract public class GeckoApp super.onPause(); } @Override public void onRestart() { GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { SharedPreferences prefs = GeckoApp.mAppContext.getSharedPreferences(GeckoApp.PREFS_NAME, 0); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean(GeckoApp.PREFS_WAS_STOPPED, false); editor.commit(); } }); @@ -2164,16 +2185,17 @@ abstract public class GeckoApp private void checkMigrateProfile() { final File profileDir = getProfile().getDir(); if (profileDir != null) { final GeckoApp app = GeckoApp.mAppContext; GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { ProfileMigrator profileMigrator = new ProfileMigrator(app); // Do a migration run on the first start after an upgrade. if (!GeckoApp.sIsUsingCustomProfile && !profileMigrator.hasMigrationRun()) { // Show the "Setting up Fennec" screen if this takes // a while. @@ -2181,29 +2203,33 @@ abstract public class GeckoApp // Create a "final" holder for the setup screen so that we can // create it in startCallback and still find a reference to it // in stopCallback. (We must create it on the UI thread to fix // bug 788216). Note that synchronization is not a problem here // since it is only ever touched on the UI thread. final SetupScreen[] setupScreenHolder = new SetupScreen[1]; final Runnable startCallback = new Runnable() { + @Override public void run() { GeckoApp.mAppContext.runOnUiThread(new Runnable() { + @Override public void run() { setupScreenHolder[0] = new SetupScreen(app); setupScreenHolder[0].show(); } }); } }; final Runnable stopCallback = new Runnable() { + @Override public void run() { GeckoApp.mAppContext.runOnUiThread(new Runnable() { + @Override public void run() { SetupScreen screen = setupScreenHolder[0]; // screen will never be null if this code runs, but // stranger things have happened... if (screen != null) { screen.dismiss(); } } @@ -2349,37 +2375,43 @@ abstract public class GeckoApp public LayerView getLayerView() { return mLayerView; } public AbsoluteLayout getPluginContainer() { return mPluginContainer; } // Accelerometer. + @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } + @Override public void onSensorChanged(SensorEvent event) { GeckoAppShell.sendEventToGecko(GeckoEvent.createSensorEvent(event)); } // Geolocation. + @Override public void onLocationChanged(Location location) { // No logging here: user-identifying information. GeckoAppShell.sendEventToGecko(GeckoEvent.createLocationEvent(location)); } + @Override public void onProviderDisabled(String provider) { } + @Override public void onProviderEnabled(String provider) { } + @Override public void onStatusChanged(String provider, int status, Bundle extras) { } // Called when a Gecko Hal WakeLock is changed public void notifyWakeLockChanged(String topic, String state) { PowerManager.WakeLock wl = mWakeLocks.get(topic); if (state.equals("locked-foreground") && wl == null) { @@ -2485,16 +2517,17 @@ abstract public class GeckoApp * its surface to be destroyed, which causes a pause composition * event to be sent to Gecko. We synchronously wait for that to be * processed. Simultaneously, however, Flash is waiting on a mutex so * the post() below is an attempt to avoid a deadlock. */ super.addView(view, index); mMainHandler.post(new Runnable() { + @Override public void run() { mLayerView.hide(); } }); } /** * The methods below are simply copied from what Android WebKit does.
--- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -173,16 +173,17 @@ public class GeckoAppShell public static native void callObserver(String observerKey, String topic, String data); public static native void removeObserver(String observerKey); public static native void onChangeNetworkLinkStatus(String status); public static native Message getNextMessageFromQueue(MessageQueue queue); public static native void onSurfaceTextureFrameAvailable(Object surfaceTexture, int id); public static void registerGlobalExceptionHandler() { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { + @Override public void uncaughtException(Thread thread, Throwable e) { Log.e(LOGTAG, ">>> REPORTING UNCAUGHT EXCEPTION FROM THREAD " + thread.getId() + " (\"" + thread.getName() + "\")", e); // If the uncaught exception was rethrown, walk the exception `cause` chain to find // the original exception so Socorro can correctly collate related crash reports. Throwable cause; while ((cause = e.getCause()) != null) { @@ -245,20 +246,22 @@ public class GeckoAppShell private GeckoMediaScannerClient(Context context, String file, String mimeType) { mFile = file; mMimeType = mimeType; mScanner = new MediaScannerConnection(context, this); mScanner.connect(); } + @Override public void onMediaScannerConnected() { mScanner.scanFile(mFile, mMimeType); } + @Override public void onScanCompleted(String path, Uri uri) { if(path.equals(mFile)) { mScanner.disconnect(); mScanner = null; } } } @@ -293,16 +296,17 @@ public class GeckoAppShell combinedArgs += " -url " + url; if (type != null) combinedArgs += " " + type; DisplayMetrics metrics = GeckoApp.mAppContext.getResources().getDisplayMetrics(); combinedArgs += " -width " + metrics.widthPixels + " -height " + metrics.heightPixels; GeckoApp.mAppContext.runOnUiThread(new Runnable() { + @Override public void run() { geckoLoaded(); } }); // and go GeckoLoader.nativeRun(combinedArgs); } @@ -412,16 +416,17 @@ public class GeckoAppShell synchronized (sSyncEvent) { sWaitingForSyncAck = false; sSyncEvent.notifyAll(); } } public static void enableLocation(final boolean enable) { getMainHandler().post(new Runnable() { + @Override public void run() { LocationManager lm = (LocationManager) GeckoApp.mAppContext.getSystemService(Context.LOCATION_SERVICE); if (enable) { Criteria criteria = new Criteria(); criteria.setSpeedRequired(false); criteria.setBearingRequired(false); @@ -621,16 +626,17 @@ public class GeckoAppShell static void createShortcut(String aTitle, String aURI, String aUniqueURI, String aIconData, String aType) { createShortcut(aTitle, aURI, aUniqueURI, BitmapUtils.getBitmapFromDataURI(aIconData), aType); } public static void createShortcut(final String aTitle, final String aURI, final String aUniqueURI, final Bitmap aIcon, final String aType) { getHandler().post(new Runnable() { + @Override public void run() { // the intent to be launched by the shortcut Intent shortcutIntent; if (aType.equalsIgnoreCase(SHORTCUT_TYPE_WEBAPP)) { shortcutIntent = getWebAppIntent(aURI, aUniqueURI, aTitle, aIcon); } else { shortcutIntent = new Intent(); shortcutIntent.setAction(GeckoApp.ACTION_BOOKMARK); @@ -657,16 +663,17 @@ public class GeckoAppShell } public static void removeShortcut(final String aTitle, final String aURI, final String aType) { removeShortcut(aTitle, aURI, null, aType); } public static void removeShortcut(final String aTitle, final String aURI, final String aUniqueURI, final String aType) { getHandler().post(new Runnable() { + @Override public void run() { // the intent to be launched by the shortcut Intent shortcutIntent; if (aType.equalsIgnoreCase(SHORTCUT_TYPE_WEBAPP)) { int index = WebAppAllocator.getInstance(GeckoApp.mAppContext).getIndexForApp(aUniqueURI); shortcutIntent = getWebAppIntent(aURI, aUniqueURI, "", null); if (shortcutIntent == null) return; @@ -691,16 +698,17 @@ public class GeckoAppShell }); } public static void uninstallWebApp(final String uniqueURI) { // On uninstall, we need to do a couple of things: // 1. nuke the running app process. // 2. nuke the profile that was assigned to that webapp getHandler().post(new Runnable() { + @Override public void run() { int index = WebAppAllocator.getInstance(GeckoApp.mAppContext).releaseIndexForApp(uniqueURI); // if -1, nothing to do; we didn't think it was installed anyway if (index == -1) return; // kill the app if it's running @@ -1127,16 +1135,17 @@ public class GeckoAppShell private static String EMPTY_STRING = new String(); // On some devices, access to the clipboard service needs to happen // on a thread with a looper, so dispatch this to our looper thread // Note: the main looper won't work because it may be blocked on the // gecko thread, which is most likely this thread static String getClipboardText() { getHandler().post(new Runnable() { + @Override @SuppressWarnings("deprecation") public void run() { Context context = GeckoApp.mAppContext; String text = null; if (android.os.Build.VERSION.SDK_INT >= 11) { android.content.ClipboardManager cm = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); if (cm.hasPrimaryClip()) { @@ -1160,16 +1169,17 @@ public class GeckoAppShell String ret = sClipboardQueue.take(); return (EMPTY_STRING.equals(ret) ? null : ret); } catch (InterruptedException ie) {} return null; } static void setClipboardText(final String text) { getHandler().post(new Runnable() { + @Override @SuppressWarnings("deprecation") public void run() { Context context = GeckoApp.mAppContext; if (android.os.Build.VERSION.SDK_INT >= 11) { android.content.ClipboardManager cm = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); cm.setPrimaryClip(ClipData.newPlainText("Text", text)); } else { @@ -1362,24 +1372,26 @@ public class GeckoAppShell public static void showInputMethodPicker() { InputMethodManager imm = (InputMethodManager) GeckoApp.mAppContext.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showInputMethodPicker(); } public static void setKeepScreenOn(final boolean on) { GeckoApp.mAppContext.runOnUiThread(new Runnable() { + @Override public void run() { // TODO } }); } public static void notifyDefaultPrevented(final boolean defaultPrevented) { getMainHandler().post(new Runnable() { + @Override public void run() { LayerView view = GeckoApp.mAppContext.getLayerView(); PanZoomController controller = (view == null ? null : view.getPanZoomController()); if (controller != null) { controller.notifyDefaultActionPrevented(defaultPrevented); } } }); @@ -1466,30 +1478,32 @@ public class GeckoAppShell appearance.recycle(); } return result; } public static void killAnyZombies() { GeckoProcessesVisitor visitor = new GeckoProcessesVisitor() { + @Override public boolean callback(int pid) { if (pid != android.os.Process.myPid()) android.os.Process.killProcess(pid); return true; } }; EnumerateGeckoProcesses(visitor); } public static boolean checkForGeckoProcs() { class GeckoPidCallback implements GeckoProcessesVisitor { public boolean otherPidExist = false; + @Override public boolean callback(int pid) { if (pid != android.os.Process.myPid()) { otherPidExist = true; return false; } return true; } } @@ -1792,16 +1806,17 @@ public class GeckoAppShell } catch(RuntimeException e) { Log.w(LOGTAG, "Error setPreviewDisplay:", e); } sCamera.setParameters(params); sCameraBuffer = new byte[(bufferSize * 12) / 8]; sCamera.addCallbackBuffer(sCameraBuffer); sCamera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback() { + @Override public void onPreviewFrame(byte[] data, android.hardware.Camera camera) { cameraCallbackBridge(data); if (sCamera != null) sCamera.addCallbackBuffer(sCameraBuffer); } }); sCamera.startPreview(); params = sCamera.getParameters(); @@ -1883,24 +1898,26 @@ public class GeckoAppShell } static void checkUriVisited(String uri) { // invoked from native JNI code GlobalHistory.getInstance().checkUriVisited(uri); } static void markUriVisited(final String uri) { // invoked from native JNI code getHandler().post(new Runnable() { + @Override public void run() { GlobalHistory.getInstance().add(uri); } }); } static void setUriTitle(final String uri, final String title) { // invoked from native JNI code getHandler().post(new Runnable() { + @Override public void run() { GlobalHistory.getInstance().update(uri, title); } }); } static void hideProgressDialog() { // unused stub @@ -2133,16 +2150,17 @@ public class GeckoAppShell static class AsyncResultHandler extends FilePickerResultHandler { private long mId; AsyncResultHandler(long id) { super(null); mId = id; } + @Override public void onActivityResult(int resultCode, Intent data) { GeckoAppShell.notifyFilePickerResult(handleActivityResult(resultCode, data), mId); } } static native void notifyFilePickerResult(String filePath, long id); @@ -2160,16 +2178,17 @@ public class GeckoAppShell public static String getGfxInfoData() { String data = sGfxInfoThread.getData(); sGfxInfoThread = null; return data; } public static void registerSurfaceTextureFrameListener(Object surfaceTexture, final int id) { ((SurfaceTexture)surfaceTexture).setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() { + @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { GeckoAppShell.onSurfaceTextureFrameAvailable(surfaceTexture, id); } }); } public static void unregisterSurfaceTextureFrameListener(Object surfaceTexture) { ((SurfaceTexture)surfaceTexture).setOnFrameAvailableListener(null);
--- a/mobile/android/base/GeckoEditable.java +++ b/mobile/android/base/GeckoEditable.java @@ -313,16 +313,17 @@ final class GeckoEditable private void geckoUpdateGecko(final boolean force) { /* We do not increment the seqno here, but only check it, because geckoUpdateGecko is a request for update. If we incremented the seqno here, geckoUpdateGecko would have prevented other updates from occurring */ final int seqnoWhenPosted = mGeckoUpdateSeqno; geckoPostToIc(new Runnable() { + @Override public void run() { mActionQueue.syncWithGecko(); if (seqnoWhenPosted == mGeckoUpdateSeqno) { icUpdateGecko(force); } } }); } @@ -615,16 +616,17 @@ final class GeckoEditable final int selStart = Math.min(action.mStart < 0 ? curStart : action.mStart, len); final int selEnd = Math.min(action.mEnd < 0 ? curEnd : action.mEnd, len); if (selStart < action.mStart || selEnd < action.mEnd) { Log.w(LOGTAG, "IME sync error: selection out of bounds"); } Selection.setSelection(mText, selStart, selEnd); geckoPostToIc(new Runnable() { + @Override public void run() { mActionQueue.syncWithGecko(); final int start = Selection.getSelectionStart(mText); final int end = Selection.getSelectionEnd(mText); if (selStart == start && selEnd == end) { // There has not been another new selection in the mean time that // made this notification out-of-date mListener.onSelectionChange(start, end); @@ -668,16 +670,17 @@ final class GeckoEditable } finally { // Ensure action is always removed from queue // even if stale action results in exception in geckoActionReply mActionQueue.poll(); } return; } geckoPostToIc(new Runnable() { + @Override public void run() { if (type == NOTIFY_IME_FOCUSCHANGE) { if (state == IME_FOCUS_STATE_BLUR) { mFocused = false; } else { mFocused = true; // Unmask events on the Gecko side mActionQueue.offer(new Action(Action.TYPE_ACKNOWLEDGE_FOCUS)); @@ -698,16 +701,17 @@ final class GeckoEditable // Because we want to be able to bind GeckoEditable to the newest LayerView instance, // this can be called from the Java IC thread in addition to the Gecko thread. if (DEBUG) { Log.d(LOGTAG, "notifyIMEEnabled(" + getConstantName(GeckoEditableListener.class, "IME_STATE_", state) + ", \"" + typeHint + "\", \"" + modeHint + "\", \"" + actionHint + "\")"); } geckoPostToIc(new Runnable() { + @Override public void run() { // Make sure there are no other things going on mActionQueue.syncWithGecko(); // Set InputConnectionHandler in notifyIMEEnabled because // GeckoInputConnection.notifyIMEEnabled calls restartInput() which will invoke // InputConnectionHandler.onCreateInputConnection LayerView v = GeckoApp.mAppContext.getLayerView(); if (v != null) { @@ -736,16 +740,17 @@ final class GeckoEditable because the IC thread should be blocked on the event action */ if (!mActionQueue.isEmpty() && mActionQueue.peek().mType == Action.TYPE_EVENT) { Selection.setSelection(mText, start, end); return; } geckoPostToIc(new Runnable() { + @Override public void run() { mActionQueue.syncWithGecko(); /* check to see there has not been another action that potentially changed the selection. If so, we can skip this update because we know there is another update right after this one that will replace the effect of this update */ if (mGeckoUpdateSeqno == seqnoWhenPosted) { /* In this case, Gecko's selection has changed and it's notifying us to change Java's selection. In the normal case, whenever Java's selection changes, @@ -835,16 +840,17 @@ final class GeckoEditable } } else { geckoReplaceText(start, oldEnd, mChangedText); } } else { geckoReplaceText(start, oldEnd, mChangedText); } geckoPostToIc(new Runnable() { + @Override public void run() { mListener.onTextChange(text, start, oldEnd, newEnd); } }); } // InvocationHandler interface
--- a/mobile/android/base/GeckoInputConnection.java +++ b/mobile/android/base/GeckoInputConnection.java @@ -390,16 +390,17 @@ class GeckoInputConnection mBatchTextChanged = false; mUpdateRequest = null; mCurrentInputMethod = ""; // Do not reset mIMEState here; see comments in notifyIMEEnabled } + @Override public void onTextChange(String text, int start, int oldEnd, int newEnd) { if (mUpdateRequest == null) { return; } if (mBatchEditCount > 0) { // Delay notification until after the batch edit @@ -427,16 +428,17 @@ class GeckoInputConnection Selection.getSelectionEnd(editable); mUpdateExtract.startOffset = 0; mUpdateExtract.text = editable; imm.updateExtractedText(v, mUpdateRequest.token, mUpdateExtract); } + @Override public void onSelectionChange(int start, int end) { if (mBatchEditCount > 0) { // Delay notification until after the batch edit mBatchSelectionChanged = true; return; } notifySelectionChange(start, end); @@ -518,16 +520,17 @@ class GeckoInputConnection : getBackgroundHandler(); if (mEditableClient.setInputConnectionHandler(newHandler)) { return newHandler; } // Setting new IC handler failed; return old IC handler return mEditableClient.getInputConnectionHandler(); } + @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { if (mIMEState == IME_STATE_DISABLED) { return null; } outAttrs.inputType = InputType.TYPE_CLASS_TEXT; outAttrs.imeOptions = EditorInfo.IME_ACTION_NONE; outAttrs.actionLabel = null; @@ -648,20 +651,22 @@ class GeckoInputConnection mThreadUtils.endWaitForUiThread(); } }); mThreadUtils.waitForUiThread(icHandler); } return false; // seems to always return false } + @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { return false; } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return processKeyDown(keyCode, event); } private boolean processKeyDown(int keyCode, KeyEvent event) { if (keyCode > KeyEvent.getMaxKeyCode()) return false; @@ -701,16 +706,17 @@ class GeckoInputConnection Handler icHandler = mEditableClient.getInputConnectionHandler(); Editable uiEditable = mThreadUtils.getEditableForUiThread(uiHandler, icHandler); if (!keyListener.onKeyDown(view, uiEditable, keyCode, event)) { mEditableClient.sendEvent(GeckoEvent.createKeyEvent(event)); } return true; } + @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return processKeyUp(keyCode, event); } private boolean processKeyUp(int keyCode, KeyEvent event) { if (keyCode > KeyEvent.getMaxKeyCode()) return false; @@ -742,45 +748,49 @@ class GeckoInputConnection Handler icHandler = mEditableClient.getInputConnectionHandler(); Editable uiEditable = mThreadUtils.getEditableForUiThread(uiHandler, icHandler); if (!keyListener.onKeyUp(view, uiEditable, keyCode, event)) { mEditableClient.sendEvent(GeckoEvent.createKeyEvent(event)); } return true; } + @Override public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { while ((repeatCount--) != 0) { if (!processKeyDown(keyCode, event) || !processKeyUp(keyCode, event)) { return false; } } return true; } + @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { View v = getView(); switch (keyCode) { case KeyEvent.KEYCODE_MENU: InputMethodManager imm = getInputMethodManager(); imm.toggleSoftInputFromWindow(v.getWindowToken(), InputMethodManager.SHOW_FORCED, 0); return true; default: break; } return false; } + @Override public boolean isIMEEnabled() { // make sure this picks up PASSWORD and PLUGIN states as well return mIMEState != IME_STATE_DISABLED; } + @Override public void notifyIME(final int type, final int state) { switch (type) { case NOTIFY_IME_CANCELCOMPOSITION: // Set composition to empty and end composition setComposingText("", 0); // Fall through @@ -798,16 +808,17 @@ class GeckoInputConnection default: if (DEBUG) { throw new IllegalArgumentException("Unexpected NOTIFY_IME=" + type); } break; } } + @Override public void notifyIMEEnabled(final int state, final String typeHint, final String modeHint, final String actionHint) { // For some input type we will use a widget to display the ui, for those we must not // display the ime. We can display a widget for date and time types and, if the sdk version // is greater than 11, for datetime/month/week as well. if (typeHint != null && (typeHint.equals("date") || typeHint.equals("time") || @@ -838,16 +849,17 @@ class GeckoInputConnection // When using Find In Page, we can still receive notifyIMEEnabled calls due to the // selection changing when highlighting. However in this case we don't want to reset/ // show/hide the keyboard because the find box has the focus and is taking input from // the keyboard. return; } restartInput(); GeckoApp.mAppContext.mMainHandler.postDelayed(new Runnable() { + @Override public void run() { if (mIMEState == IME_STATE_DISABLED) { hideSoftInput(); } else { showSoftInput(); } } }, 200); // Delay 200ms to prevent repeated IME showing/hiding @@ -875,16 +887,17 @@ final class DebugGeckoInputConnection DebugGeckoInputConnection dgic = new DebugGeckoInputConnection(targetView, editable); dgic.mProxy = (InputConnection)Proxy.newProxyInstance( GeckoInputConnection.class.getClassLoader(), PROXY_INTERFACES, dgic); return (GeckoEditableListener)dgic.mProxy; } + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { StringBuilder log = new StringBuilder(mCallLevel); log.append("> ").append(method.getName()).append("("); for (Object arg : args) { // translate argument values to constant names if ("notifyIME".equals(method.getName()) && arg == args[0]) {
--- a/mobile/android/base/GeckoPreferences.java +++ b/mobile/android/base/GeckoPreferences.java @@ -98,23 +98,25 @@ public class GeckoPreferences public void onResume() { super.onResume(); if (getApplication() instanceof GeckoApplication) { ((GeckoApplication) getApplication()).onActivityResume(this); } } + @Override public void handleMessage(String event, JSONObject message) { try { if (event.equals("Sanitize:Finished")) { boolean success = message.getBoolean("success"); final int stringRes = success ? R.string.private_data_success : R.string.private_data_fail; final Context context = this; GeckoAppShell.getMainHandler().post(new Runnable () { + @Override public void run() { Toast.makeText(context, stringRes, Toast.LENGTH_SHORT).show(); } }); } } catch (Exception e) { Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); } @@ -270,49 +272,55 @@ public class GeckoPreferences AlertDialog dialog = null; PasswordTextWatcher(EditText aInput1, EditText aInput2, AlertDialog aDialog) { input1 = aInput1; input2 = aInput2; dialog = aDialog; } + @Override public void afterTextChanged(Editable s) { if (dialog == null) return; String text1 = input1.getText().toString(); String text2 = input2.getText().toString(); boolean disabled = TextUtils.isEmpty(text1) || TextUtils.isEmpty(text2) || !text1.equals(text2); dialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(!disabled); } + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } } private class EmptyTextWatcher implements TextWatcher { EditText input = null; AlertDialog dialog = null; EmptyTextWatcher(EditText aInput, AlertDialog aDialog) { input = aInput; dialog = aDialog; } + @Override public void afterTextChanged(Editable s) { if (dialog == null) return; String text = input.getText().toString(); boolean disabled = TextUtils.isEmpty(text); dialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(!disabled); } + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } } @Override protected Dialog onCreateDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(this); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); @@ -322,38 +330,41 @@ public class GeckoPreferences final EditText input1 = getTextBox(R.string.masterpassword_password); final EditText input2 = getTextBox(R.string.masterpassword_confirm); linearLayout.addView(input1); linearLayout.addView(input2); builder.setTitle(R.string.masterpassword_create_title) .setView((View)linearLayout) .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { JSONObject jsonPref = new JSONObject(); try { jsonPref.put("name", PREFS_MP_ENABLED); jsonPref.put("type", "string"); jsonPref.put("value", input1.getText().toString()); GeckoEvent event = GeckoEvent.createBroadcastEvent("Preferences:Set", jsonPref.toString()); GeckoAppShell.sendEventToGecko(event); } catch(Exception ex) { Log.e(LOGTAG, "Error setting master password", ex); } return; } }) .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { return; } }); dialog = builder.create(); dialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override public void onShow(DialogInterface dialog) { input1.setText(""); input2.setText(""); input1.requestFocus(); } }); PasswordTextWatcher watcher = new PasswordTextWatcher(input1, input2, dialog); @@ -363,32 +374,36 @@ public class GeckoPreferences break; case DIALOG_REMOVE_MASTER_PASSWORD: final EditText input = getTextBox(R.string.masterpassword_password); linearLayout.addView(input); builder.setTitle(R.string.masterpassword_remove_title) .setView((View)linearLayout) .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { PrefsHelper.setPref(PREFS_MP_ENABLED, input.getText().toString()); } }) .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int which) { return; } }); dialog = builder.create(); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override public void onDismiss(DialogInterface dialog) { input.setText(""); } }); dialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override public void onShow(DialogInterface dialog) { input.setText(""); } }); input.addTextChangedListener(new EmptyTextWatcher(input, dialog)); break; default: return null; @@ -404,68 +419,74 @@ public class GeckoPreferences private Preference getField(String prefName) { return (mPreferenceScreen == null ? null : mPreferenceScreen.findPreference(prefName)); } @Override public void prefValue(String prefName, final boolean value) { final Preference pref = getField(prefName); if (pref instanceof CheckBoxPreference) { GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { if (((CheckBoxPreference)pref).isChecked() != value) ((CheckBoxPreference)pref).setChecked(value); } }); } } @Override public void prefValue(String prefName, final String value) { final Preference pref = getField(prefName); if (pref instanceof EditTextPreference) { GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { ((EditTextPreference)pref).setText(value); } }); } else if (pref instanceof ListPreference) { GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { ((ListPreference)pref).setValue(value); // Set the summary string to the current entry CharSequence selectedEntry = ((ListPreference)pref).getEntry(); ((ListPreference)pref).setSummary(selectedEntry); } }); } else if (pref instanceof FontSizePreference) { final FontSizePreference fontSizePref = (FontSizePreference) pref; fontSizePref.setSavedFontSize(value); final String fontSizeName = fontSizePref.getSavedFontSizeName(); GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { fontSizePref.setSummary(fontSizeName); // Ex: "Small". } }); } } @Override public void finish() { // enable all preferences once we have them from gecko GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { mPreferenceScreen.setEnabled(true); } }); } }); } private void registerEventListener(String event) { GeckoAppShell.getEventDispatcher().registerEventListener(event, this); } private void unregisterEventListener(String event) { GeckoAppShell.getEventDispatcher().unregisterEventListener(event, this); } + @Override public boolean isGeckoActivityOpened() { return false; } }
--- a/mobile/android/base/GeckoSmsManager.java +++ b/mobile/android/base/GeckoSmsManager.java @@ -347,16 +347,17 @@ public class GeckoSmsManager private final static int kMessageClassClass3 = 4; private final static String[] kRequiredMessageRows = new String[] { "_id", "address", "body", "date", "type", "status" }; public GeckoSmsManager() { SmsIOThread.getInstance().start(); } + @Override public void start() { IntentFilter smsFilter = new IntentFilter(); smsFilter.addAction(GeckoSmsManager.ACTION_SMS_RECEIVED); smsFilter.addAction(GeckoSmsManager.ACTION_SMS_SENT); smsFilter.addAction(GeckoSmsManager.ACTION_SMS_DELIVERED); GeckoApp.mAppContext.registerReceiver(this, smsFilter); } @@ -480,16 +481,17 @@ public class GeckoSmsManager !envelope.arePartsRemaining(Envelope.SubParts.DELIVERED_PART)) { postman.destroyEnvelope(envelopeId); } return; } } + @Override public void send(String aNumber, String aMessage, int aRequestId) { int envelopeId = Postman.kUnknownEnvelopeId; try { SmsManager sm = SmsManager.getDefault(); Intent sentIntent = new Intent(ACTION_SMS_SENT); Intent deliveredIntent = new Intent(ACTION_SMS_DELIVERED); @@ -595,16 +597,17 @@ public class GeckoSmsManager Log.e("GeckoSmsManager", "The id we received is higher than the higher allowed value."); return -1; } catch (Exception e) { Log.e("GeckoSmsManager", "Something went wrong when trying to write a sent message", e); return -1; } } + @Override public void getMessage(int aMessageId, int aRequestId) { class GetMessageRunnable implements Runnable { private int mMessageId; private int mRequestId; GetMessageRunnable(int aMessageId, int aRequestId) { mMessageId = aMessageId; mRequestId = aRequestId; @@ -679,16 +682,17 @@ public class GeckoSmsManager } if (!SmsIOThread.getInstance().execute(new GetMessageRunnable(aMessageId, aRequestId))) { Log.e("GeckoSmsManager", "Failed to add GetMessageRunnable to the SmsIOThread"); notifyGetSmsFailed(kUnknownError, aRequestId); } } + @Override public void deleteMessage(int aMessageId, int aRequestId) { class DeleteMessageRunnable implements Runnable { private int mMessageId; private int mRequestId; DeleteMessageRunnable(int aMessageId, int aRequestId) { mMessageId = aMessageId; mRequestId = aRequestId; @@ -718,16 +722,17 @@ public class GeckoSmsManager } if (!SmsIOThread.getInstance().execute(new DeleteMessageRunnable(aMessageId, aRequestId))) { Log.e("GeckoSmsManager", "Failed to add GetMessageRunnable to the SmsIOThread"); notifySmsDeleteFailed(kUnknownError, aRequestId); } } + @Override public void createMessageList(long aStartDate, long aEndDate, String[] aNumbers, int aNumbersCount, int aDeliveryState, boolean aReverse, int aRequestId) { class CreateMessageListRunnable implements Runnable { private long mStartDate; private long mEndDate; private String[] mNumbers; private int mNumbersCount; private int mDeliveryState; private boolean mReverse; @@ -840,16 +845,17 @@ public class GeckoSmsManager } if (!SmsIOThread.getInstance().execute(new CreateMessageListRunnable(aStartDate, aEndDate, aNumbers, aNumbersCount, aDeliveryState, aReverse, aRequestId))) { Log.e("GeckoSmsManager", "Failed to add CreateMessageListRunnable to the SmsIOThread"); notifyReadingMessageListFailed(kUnknownError, aRequestId); } } + @Override public void getNextMessageInList(int aListId, int aRequestId) { class GetNextMessageInListRunnable implements Runnable { private int mListId; private int mRequestId; GetNextMessageInListRunnable(int aListId, int aRequestId) { mListId = aListId; mRequestId = aRequestId; @@ -899,24 +905,27 @@ public class GeckoSmsManager } if (!SmsIOThread.getInstance().execute(new GetNextMessageInListRunnable(aListId, aRequestId))) { Log.e("GeckoSmsManager", "Failed to add GetNextMessageInListRunnable to the SmsIOThread"); notifyReadingMessageListFailed(kUnknownError, aRequestId); } } + @Override public void clearMessageList(int aListId) { MessagesListManager.getInstance().remove(aListId); } + @Override public void stop() { GeckoApp.mAppContext.unregisterReceiver(this); } + @Override public void shutdown() { SmsIOThread.getInstance().interrupt(); MessagesListManager.getInstance().clear(); } private int getGeckoDeliveryStatus(int aDeliveryStatus) { if (aDeliveryStatus == kInternalDeliveryStatusNone) { return kDeliveryStatusNotApplicable;
--- a/mobile/android/base/GeckoThread.java +++ b/mobile/android/base/GeckoThread.java @@ -109,16 +109,17 @@ public class GeckoThread extends Thread String type = getTypeFromAction(mIntent.getAction()); mIntent = null; // and then fire us up Log.i(LOGTAG, "RunGecko - args = " + args); GeckoAppShell.runGecko(path, args, mUri, type); } + @Override public void handleMessage(String event, JSONObject message) { if ("Gecko:Ready".equals(event)) { GeckoAppShell.getEventDispatcher().unregisterEventListener(event, this); setLaunchState(LaunchState.GeckoRunning); GeckoAppShell.sendPendingEventsToGecko(); } }
--- a/mobile/android/base/GlobalHistory.java +++ b/mobile/android/base/GlobalHistory.java @@ -39,16 +39,17 @@ class GlobalHistory { private final Runnable mNotifierRunnable; // off-thread runnable used to check URIs private boolean mProcessing; // = false // whether or not the runnable is queued/working private GlobalHistory() { mHandler = GeckoAppShell.getHandler(); mPendingUris = new LinkedList<String>(); mVisitedCache = new SoftReference<Set<String>>(null); mNotifierRunnable = new Runnable() { + @Override public void run() { Set<String> visitedSet = mVisitedCache.get(); if (visitedSet == null) { // the cache was wiped away, repopulate it Log.w(LOGTAG, "Rebuilding visited link set..."); visitedSet = new HashSet<String>(); Cursor c = BrowserDB.getAllVisitedHistory(GeckoApp.mAppContext.getContentResolver()); if (c.moveToFirst()) { @@ -127,16 +128,17 @@ class GlobalHistory { if (!canAddURI(uri)) return; BrowserDB.updateHistoryTitle(GeckoApp.mAppContext.getContentResolver(), uri, title); } public void checkUriVisited(final String uri) { mHandler.post(new Runnable() { + @Override public void run() { // this runs on the same handler thread as the processing loop, // so no synchronization needed mPendingUris.add(uri); if (mProcessing) { // there's already a runnable queued up or working away, so // no need to post another return;
--- a/mobile/android/base/JavaAddonManager.java +++ b/mobile/android/base/JavaAddonManager.java @@ -76,16 +76,17 @@ class JavaAddonManager implements GeckoE // we've already done this registration. don't do it again return; } mApplicationContext = applicationContext; mDispatcher.registerEventListener("Dex:Load", this); mDispatcher.registerEventListener("Dex:Unload", this); } + @Override public void handleMessage(String event, JSONObject message) { try { if (event.equals("Dex:Load")) { String zipFile = message.getString("zipfile"); String implClass = message.getString("impl"); Log.d(LOGTAG, "Attempting to load classes.dex file from " + zipFile + " and instantiate " + implClass); try { File tmpDir = mApplicationContext.getDir("dex", 0); @@ -168,29 +169,31 @@ class JavaAddonManager implements GeckoE } } catch (JSONException e) { Log.d(LOGTAG, "Error during JSON->bundle conversion", e); } } return b; } + @Override public void handleMessage(String event, JSONObject json) { try { if (mBundle != null) { Log.w(LOGTAG, "Event [" + event + "] handler is re-entrant; response messages may be lost"); } mBundle = jsonToBundle(json); Message msg = new Message(); msg.setData(mBundle); mDelegate.handleMessage(msg); } catch (Exception e) { Log.e(LOGTAG, "Caught exception thrown from wrapped addon message handler", e); } } + @Override public String getResponse() { String response = mBundle.getString("response"); mBundle = null; return response; } } }
--- a/mobile/android/base/LauncherShortcuts.java.in +++ b/mobile/android/base/LauncherShortcuts.java.in @@ -177,24 +177,26 @@ public class LauncherShortcuts extends A builder.setTitle(R.string.launcher_shortcuts_title); builder.setAdapter(new SimpleAdapter( LauncherShortcuts.this, mWebappsList, R.layout.launch_app_listitem, new String[] { "favicon", "title" }, new int[] { R.id.favicon, R.id.title } ), new DialogInterface.OnClickListener() { + @Override public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); onListItemClick(id); finish(); } }); builder.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override public void onCancel(DialogInterface dialog) { dialog.dismiss(); finish(); } }); builder.create().show(); } else {
--- a/mobile/android/base/LightweightTheme.java +++ b/mobile/android/base/LightweightTheme.java @@ -85,25 +85,27 @@ public class LightweightTheme implements headerURL = headerURL.substring(0, mark); try { // Get the image and convert it to a bitmap. URL url = new URL(headerURL); InputStream stream = url.openStream(); final Bitmap bitmap = BitmapFactory.decodeStream(stream); stream.close(); mHandler.post(new Runnable() { + @Override public void run() { setLightweightTheme(bitmap); } }); } catch(MalformedURLException e) { } catch(IOException e) { } } else if (event.equals("LightweightTheme:Disable")) { mHandler.post(new Runnable() { + @Override public void run() { resetLightweightTheme(); } }); } } catch (Exception e) { Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); }
--- a/mobile/android/base/MultiChoicePreference.java +++ b/mobile/android/base/MultiChoicePreference.java @@ -144,16 +144,17 @@ class MultiChoicePreference extends Dial } if (mEntries.length != mEntryKeys.length || mEntryKeys.length != mInitialValues.length) { throw new IllegalStateException( "MultiChoicePreference entries, entryKeys, and initialValues arrays must be the same length"); } builder.setMultiChoiceItems(mEntries, mValues, new DialogInterface.OnMultiChoiceClickListener() { + @Override public void onClick(DialogInterface dialog, int which, boolean val) { // mValues is automatically updated when checkboxes are clicked // enable positive button only if at least one item is checked boolean enabled = false; for (int i = 0; i < mValues.length; i++) { if (mValues[i]) { enabled = true; @@ -179,16 +180,17 @@ class MultiChoicePreference extends Dial // user cancelled; reset checkbox values to their previous state mValues = mPrevValues.clone(); return; } else { mPrevValues = mValues.clone(); } GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { for (int i = 0; i < mEntryKeys.length; i++) { String key = mEntryKeys[i].toString(); persistBoolean(key, mValues[i]); } } }); } @@ -227,16 +229,17 @@ class MultiChoicePreference extends Dial final int entryCount = mEntryKeys.length; if (entryCount != mEntries.length || entryCount != mInitialValues.length) { throw new IllegalStateException( "MultiChoicePreference entryKeys and initialValues arrays must be the same length"); } mValues = new boolean[entryCount]; GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { for (int i = 0; i < entryCount; i++) { String key = mEntryKeys[i].toString(); boolean initialValue = mInitialValues[i].equals("true"); mValues[i] = getPersistedBoolean(key, initialValue); } mPrevValues = mValues.clone(); }
--- a/mobile/android/base/PrefsHelper.java +++ b/mobile/android/base/PrefsHelper.java @@ -145,24 +145,28 @@ public final class PrefsHelper { public interface PrefHandler { void prefValue(String pref, boolean value); void prefValue(String pref, int value); void prefValue(String pref, String value); void finish(); } public static abstract class PrefHandlerBase implements PrefHandler { + @Override public void prefValue(String pref, boolean value) { Log.w(LOGTAG, "Unhandled boolean value for pref [" + pref + "]"); } + @Override public void prefValue(String pref, int value) { Log.w(LOGTAG, "Unhandled int value for pref [" + pref + "]"); } + @Override public void prefValue(String pref, String value) { Log.w(LOGTAG, "Unhandled String value for pref [" + pref + "]"); } + @Override public void finish() { } } }
--- a/mobile/android/base/ProfileMigrator.java +++ b/mobile/android/base/ProfileMigrator.java @@ -605,16 +605,17 @@ public class ProfileMigrator { final String syncKey = mSyncSettingsMap.get("Mozilla Services Encryption Passphrase"); final String syncPass = mSyncSettingsMap.get("Mozilla Services Password"); final String serverURL = mSyncSettingsMap.get("services.sync.serverURL"); final String clusterURL = mSyncSettingsMap.get("services.sync.clusterURL"); final String clientName = mSyncSettingsMap.get("services.sync.client.name"); final String clientGuid = mSyncSettingsMap.get("services.sync.client.GUID"); GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { if (userName == null || syncKey == null || syncPass == null) { // This isn't going to work. Give up. Log.e(LOGTAG, "Profile has incomplete Sync config. Not migrating."); setMigratedSync(); return; } @@ -632,30 +633,32 @@ public class ProfileMigrator { } setMigratedSync(); } }); } protected void registerAndRequest() { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { requestValues(); } }); } @Override public void run() { // Run only if no Sync accounts exist. new SyncAccounts.AccountsExistTask() { @Override protected void onPostExecute(Boolean result) { if (result.booleanValue()) { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { Log.i(LOGTAG, "Sync account already configured, skipping."); setMigratedSync(); } }); } else { // No account configured, fire up. registerAndRequest(); @@ -926,16 +929,17 @@ public class ProfileMigrator { // We're at the end if we got less results than requested. if (queryResultEntries < mMaxEntries) { setMigratedHistory(); } // GlobalHistory access communicates with Gecko // and must run on its thread. GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { for (String url : placesHistory) { GlobalHistory.getInstance().addToGeckoOnly(url); } } }); }
--- a/mobile/android/base/PromptService.java +++ b/mobile/android/base/PromptService.java @@ -179,16 +179,17 @@ public class PromptService implements On input.setText(mValue); if (!TextUtils.isEmpty(mHint)) { input.setHint(mHint); } if (mAutofocus) { input.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { ((InputMethodManager) GeckoApp.mAppContext.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(v, 0); } } }); input.requestFocus(); } @@ -259,26 +260,29 @@ public class PromptService implements On return formatDateString("yyyy-MM",calendar); } } return ""; } } // GeckoEventListener implementation + @Override public void handleMessage(String event, final JSONObject message) { // The dialog must be created on the UI thread. GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { processMessage(message); } }); } // GeckoEventResponder implementation + @Override public String getResponse() { // we only handle one kind of message in handleMessage, and this is the // response we provide for that message String promptServiceResult = ""; try { promptServiceResult = waitForReturn(); } catch (InterruptedException e) { } return promptServiceResult; @@ -379,16 +383,17 @@ public class PromptService implements On } } mDialog = builder.create(); mDialog.setOnCancelListener(PromptService.this); mDialog.show(); } + @Override public void onClick(DialogInterface aDialog, int aWhich) { GeckoApp.assertOnUiThread(); JSONObject ret = new JSONObject(); try { int button = -1; ListView list = mDialog.getListView(); if (list != null || mSelected != null) { button = aWhich; @@ -420,21 +425,23 @@ public class PromptService implements On if (mDialog != null) { mDialog.dismiss(); } finishDialog(ret.toString()); } + @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { GeckoApp.assertOnUiThread(); mSelected[position] = !mSelected[position]; } + @Override public void onCancel(DialogInterface aDialog) { GeckoApp.assertOnUiThread(); JSONObject ret = new JSONObject(); try { ret.put("button", -1); } catch(Exception ex) { } finishDialog(ret.toString()); }
--- a/mobile/android/base/ShapedButton.java +++ b/mobile/android/base/ShapedButton.java @@ -16,17 +16,19 @@ public abstract class ShapedButton exten LightweightTheme.OnChangeListener { protected GeckoActivity mActivity; protected Path mPath; protected CurveTowards mSide; protected CanvasDelegate mCanvasDelegate; protected enum CurveTowards { NONE, LEFT, RIGHT }; + @Override abstract public void onLightweightThemeChanged(); + @Override abstract public void onLightweightThemeReset(); public ShapedButton(Context context, AttributeSet attrs) { super(context, attrs); mActivity = (GeckoActivity) context; TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BrowserToolbarCurve); int curveTowards = a.getInt(R.styleable.BrowserToolbarCurve_curveTowards, 0x02);
--- a/mobile/android/base/Tab.java +++ b/mobile/android/base/Tab.java @@ -159,16 +159,17 @@ public class Tab { mThumbnailBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); } return mThumbnailBitmap; } public void updateThumbnail(final Bitmap b) { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { if (b != null) { try { mThumbnail = new BitmapDrawable(b); if (mState == Tab.STATE_SUCCESS) saveThumbnailToDB(); } catch (OutOfMemoryError oom) { Log.w(LOGTAG, "Unable to create/scale bitmap.", oom); @@ -316,16 +317,17 @@ public class Tab { public void setReaderEnabled(boolean readerEnabled) { mReaderEnabled = readerEnabled; Tabs.getInstance().notifyListeners(this, Tabs.TabEvents.MENU_UPDATED); } void updateBookmark() { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { final String url = getURL(); if (url == null) return; if (url.equals(getURL())) { mBookmark = BrowserDB.isBookmark(getContentResolver(), url); mReadingListItem = BrowserDB.isReadingListItem(getContentResolver(), url); @@ -333,28 +335,30 @@ public class Tab { Tabs.getInstance().notifyListeners(Tab.this, Tabs.TabEvents.MENU_UPDATED); } }); } public void addBookmark() { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { String url = getURL(); if (url == null) return; BrowserDB.addBookmark(getContentResolver(), mTitle, url); } }); } public void removeBookmark() { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { String url = getURL(); if (url == null) return; BrowserDB.removeBookmarksWithURL(getContentResolver(), url); } }); @@ -541,16 +545,17 @@ public class Tab { } void handleDocumentStop(boolean success) { setState(success ? STATE_SUCCESS : STATE_ERROR); final String oldURL = getURL(); final Tab tab = this; GeckoAppShell.getHandler().postDelayed(new Runnable() { + @Override public void run() { // tab.getURL() may return null if (!TextUtils.equals(oldURL, getURL())) return; ThumbnailHelper.getInstance().getAndProcessThumbnailFor(tab); } }, 500);
--- a/mobile/android/base/Tabs.java +++ b/mobile/android/base/Tabs.java @@ -82,16 +82,17 @@ public class Tabs implements GeckoEventL } public void attachToActivity(GeckoApp activity) { mActivity = activity; mAccountManager = AccountManager.get(mActivity); // The listener will run on the background thread (see 2nd argument) mAccountManager.addOnAccountsUpdatedListener(mAccountListener = new OnAccountsUpdateListener() { + @Override public void onAccountsUpdated(Account[] accounts) { persistAllTabs(); } }, GeckoAppShell.getHandler(), false); if (mContentObserver != null) { BrowserDB.registerBookmarkObserver(getContentResolver(), mContentObserver); } } @@ -156,16 +157,17 @@ public class Tabs implements GeckoEventL final Tab tab = mTabs.get(id); // This avoids a NPE below, but callers need to be careful to // handle this case if (tab == null || oldTab == tab) return null; mSelectedTab = tab; mActivity.runOnUiThread(new Runnable() { + @Override public void run() { if (isSelectedTab(tab)) { notifyListeners(tab, TabEvents.SELECTED); if (oldTab != null) notifyListeners(oldTab, TabEvents.UNSELECTED); } } @@ -276,16 +278,17 @@ public class Tabs implements GeckoEventL } public static Tabs getInstance() { return Tabs.TabsInstanceHolder.INSTANCE; } // GeckoEventListener implementation + @Override public void handleMessage(String event, JSONObject message) { try { if (event.equals("Session:RestoreEnd")) { notifyListeners(null, TabEvents.RESTORED); return; } // All other events handled below should contain a tabID property @@ -377,16 +380,17 @@ public class Tabs implements GeckoEventL } public void refreshThumbnails() { final ThumbnailHelper helper = ThumbnailHelper.getInstance(); Iterator<Tab> iterator = mTabs.values().iterator(); while (iterator.hasNext()) { final Tab tab = iterator.next(); GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { helper.getAndProcessThumbnailFor(tab); } }); } } public interface OnTabsChangedListener { @@ -432,16 +436,17 @@ public class Tabs implements GeckoEventL } public void notifyListeners(Tab tab, TabEvents msg) { notifyListeners(tab, msg, ""); } public void notifyListeners(final Tab tab, final TabEvents msg, final Object data) { mActivity.runOnUiThread(new Runnable() { + @Override public void run() { onTabChanged(tab, msg, data); if (mTabsChangedListeners == null) return; Iterator<OnTabsChangedListener> items = mTabsChangedListeners.iterator(); while (items.hasNext()) { @@ -476,16 +481,17 @@ public class Tabs implements GeckoEventL mScore = 0; } } // This method persists the current ordered list of tabs in our tabs content provider. public void persistAllTabs() { final Iterable<Tab> tabs = getTabsInOrder(); GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { boolean syncIsSetup = SyncAccounts.syncAccountsExist(mActivity); if (syncIsSetup) TabsAccessor.persistLocalTabs(getContentResolver(), tabs); } }); }
--- a/mobile/android/base/TabsPanel.java +++ b/mobile/android/base/TabsPanel.java @@ -95,16 +95,17 @@ public class TabsPanel extends LinearLay mPanelRemote = (RemoteTabs) findViewById(R.id.synced_tabs); mPanelRemote.setTabsPanel(this); mFooter = (RelativeLayout) findViewById(R.id.tabs_panel_footer); mAddTab = (ImageButton) findViewById(R.id.add_tab); mAddTab.setOnClickListener(new Button.OnClickListener() { + @Override public void onClick(View v) { TabsPanel.this.addTab(); } }); mTabWidget = (IconTabWidget) findViewById(R.id.tab_widget); mTabWidget.addTab(R.drawable.tabs_normal); mTabWidget.addTab(R.drawable.tabs_private);
--- a/mobile/android/base/TabsTray.java +++ b/mobile/android/base/TabsTray.java @@ -140,24 +140,26 @@ public class TabsTray extends TwoWayView private Button.OnClickListener mOnCloseClickListener; public TabsAdapter(Context context, boolean isPrivate) { mContext = context; mInflater = LayoutInflater.from(mContext); mIsPrivate = isPrivate; mOnCloseClickListener = new Button.OnClickListener() { + @Override public void onClick(View v) { TabRow tab = (TabRow) v.getTag(); final int pos = (isVertical() ? tab.info.getWidth() : tab.info.getHeight()); animateClose(tab.info, pos); } }; } + @Override public void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { switch (msg) { case ADDED: // Refresh the list to make sure the new tab is added in the right position. refreshTabsData(); break; case CLOSED: @@ -206,24 +208,27 @@ public class TabsTray extends TwoWayView TabsTray.this.setSelection(selected); } public void clear() { mTabs = null; notifyDataSetChanged(); // Be sure to call this whenever mTabs changes. } + @Override public int getCount() { return (mTabs == null ? 0 : mTabs.size()); } + @Override public Tab getItem(int position) { return mTabs.get(position); } + @Override public long getItemId(int position) { return position; } private int getPositionForTab(Tab tab) { if (mTabs == null || tab == null) return -1; @@ -251,16 +256,17 @@ public class TabsTray extends TwoWayView row.thumbnail.setImageResource(R.drawable.abouthome_thumbnail); else row.thumbnail.setImageResource(R.drawable.tab_thumbnail_default); row.title.setText(tab.getDisplayTitle()); row.close.setTag(row); } + @Override public View getView(int position, View convertView, ViewGroup parent) { TabRow row; if (convertView == null) { convertView = mInflater.inflate(R.layout.tabs_row, null); row = new TabRow(convertView); row.close.setOnClickListener(mOnCloseClickListener); convertView.setTag(row); @@ -287,17 +293,19 @@ public class TabsTray extends TwoWayView animator.attach(view, Property.TRANSLATION_X, pos); else animator.attach(view, Property.TRANSLATION_Y, pos); mCloseAnimationCount++; mPendingClosedTabs.add(view); animator.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { + @Override public void onPropertyAnimationStart() { } + @Override public void onPropertyAnimationEnd() { mCloseAnimationCount--; if (mCloseAnimationCount > 0) return; for (View pendingView : mPendingClosedTabs) { animateFinishClose(pendingView); } @@ -321,17 +329,19 @@ public class TabsTray extends TwoWayView else animator.attach(view, Property.WIDTH, 1); TabRow tab = (TabRow)view.getTag(); final int tabId = tab.id; final int originalSize = (isVertical ? view.getHeight() : view.getWidth()); animator.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { + @Override public void onPropertyAnimationStart() { } + @Override public void onPropertyAnimationEnd() { // Reset view presentation as it will be recycled in the // list view by the adapter. AnimatorProxy proxy = AnimatorProxy.create(view); proxy.setAlpha(1); if (isVertical) { proxy.setHeight(originalSize); @@ -356,17 +366,19 @@ public class TabsTray extends TwoWayView if (isVertical()) animator.attach(view, Property.TRANSLATION_X, 0); else animator.attach(view, Property.TRANSLATION_Y, 0); animator.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { + @Override public void onPropertyAnimationStart() { } + @Override public void onPropertyAnimationEnd() { TabRow tab = (TabRow) view.getTag(); tab.close.setVisibility(View.VISIBLE); } }); animator.start(); }
--- a/mobile/android/base/TextSelection.java +++ b/mobile/android/base/TextSelection.java @@ -64,18 +64,20 @@ class TextSelection extends Layer implem return mStartHandle; } else if (name.equals("MIDDLE")) { return mMiddleHandle; } else { return mEndHandle; } } + @Override public void handleMessage(final String event, final JSONObject message) { mActivity.runOnUiThread(new Runnable() { + @Override public void run() { try { if (event.equals("TextSelection:ShowHandles")) { final JSONArray handles = message.getJSONArray("handles"); for (int i=0; i < handles.length(); i++) { String handle = handles.getString(i); getHandle(handle).setVisibility(View.VISIBLE); } @@ -128,16 +130,17 @@ class TextSelection extends Layer implem && FloatUtils.fuzzyEquals(mViewZoom, context.zoomFactor)) { return; } mViewLeft = context.viewport.left; mViewTop = context.viewport.top; mViewZoom = context.zoomFactor; mActivity.runOnUiThread(new Runnable() { + @Override public void run() { mStartHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); mMiddleHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); mEndHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); } }); }
--- a/mobile/android/base/TextSelectionHandle.java +++ b/mobile/android/base/TextSelectionHandle.java @@ -63,16 +63,17 @@ class TextSelectionHandle extends ImageV mIsRTL = false; mGeckoPoint = new PointF(0.0f, 0.0f); mWidth = getResources().getDimensionPixelSize(R.dimen.text_selection_handle_width); mHeight = getResources().getDimensionPixelSize(R.dimen.text_selection_handle_height); mShadow = getResources().getDimensionPixelSize(R.dimen.text_selection_handle_shadow); } + @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { mTouchStartX = event.getX(); mTouchStartY = event.getY(); int[] rect = new int[2]; mActivity.getLayerView().getLocationOnScreen(rect);
--- a/mobile/android/base/UiAsyncTask.java +++ b/mobile/android/base/UiAsyncTask.java @@ -38,32 +38,35 @@ public abstract class UiAsyncTask<Params private final class BackgroundTaskRunnable implements Runnable { private Params[] mParams; public BackgroundTaskRunnable(Params... params) { mParams = params; } + @Override public void run() { final Result result = doInBackground(mParams); getUiHandler().post(new Runnable() { + @Override public void run() { if (mCancelled) onCancelled(); else onPostExecute(result); } }); } } public final void execute(final Params... params) { getUiHandler().post(new Runnable() { + @Override public void run() { onPreExecute(); mBackgroundThreadHandler.post(new BackgroundTaskRunnable(params)); } }); } @SuppressWarnings({"UnusedParameters"})
--- a/mobile/android/base/WebApp.java.in +++ b/mobile/android/base/WebApp.java.in @@ -231,20 +231,23 @@ public class WebApp extends GeckoApp { Log.e(LOGTAG, "Unable to parse url: ", ex); } } break; case LOADED: if (mSplashscreen.getVisibility() == View.VISIBLE) { Animation fadeout = AnimationUtils.loadAnimation(this, android.R.anim.fade_out); fadeout.setAnimationListener(new Animation.AnimationListener() { + @Override public void onAnimationEnd(Animation animation) { mSplashscreen.setVisibility(View.GONE); } + @Override public void onAnimationRepeat(Animation animation) { } + @Override public void onAnimationStart(Animation animation) { } }); mSplashscreen.startAnimation(fadeout); } break; case START: if (mSplashscreen.getVisibility() == View.VISIBLE) { View area = findViewById(R.id.splashscreen_progress);
--- a/mobile/android/base/WebAppAllocator.java +++ b/mobile/android/base/WebAppAllocator.java @@ -66,16 +66,17 @@ public class WebAppAllocator { if (index != -1) return index; for (int i = 0; i < MAX_WEB_APPS; ++i) { if (!mPrefs.contains(appKey(i))) { // found unused index i final int foundIndex = i; GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { int color = 0; try { color = BitmapUtils.getDominantColor(aIcon); } catch (Exception e) { e.printStackTrace(); } @@ -113,16 +114,17 @@ public class WebAppAllocator { return -1; releaseIndex(index); return index; } public synchronized void releaseIndex(final int index) { GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { mPrefs.edit() .remove(appKey(index)) .remove(iconKey(index)) .commit(); } }); }
--- a/mobile/android/base/awesomebar/AllPagesTab.java +++ b/mobile/android/base/awesomebar/AllPagesTab.java @@ -123,16 +123,17 @@ public class AllPagesTab extends Awesome if (mView == null) { mView = (LinearLayout) (LayoutInflater.from(mContext).inflate(R.layout.awesomebar_allpages_list, null)); mView.setTag(TAG); ListView list = getListView(); list.setTag(TAG); ((Activity)mContext).registerForContextMenu(list); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { handleItemClick(parent, view, position, id); } }); AwesomeBarCursorAdapter adapter = getCursorAdapter(); list.setAdapter(adapter); list.setOnTouchListener(mListListener); @@ -171,16 +172,17 @@ public class AllPagesTab extends Awesome } } /** * Query for suggestions, but don't show them yet. */ private void primeSuggestions() { GeckoAppShell.getHandler().post(new Runnable() { + @Override public void run() { mSuggestClient.query(mSearchTerm); } }); } private void filterSuggestions(String searchTerm) { // cancel previous query @@ -205,16 +207,17 @@ public class AllPagesTab extends Awesome } protected AwesomeBarCursorAdapter getCursorAdapter() { if (mCursorAdapter == null) { // Load the list using a custom adapter so we can create the bitmaps mCursorAdapter = new AwesomeBarCursorAdapter(mContext); mCursorAdapter.setFilterQueryProvider(new FilterQueryProvider() { + @Override public Cursor runQuery(CharSequence constraint) { long start = SystemClock.uptimeMillis(); Cursor c = BrowserDB.filter(getContentResolver(), constraint, MAX_RESULTS); c.getCount(); postLoadFavicons(); @@ -240,26 +243,28 @@ public class AllPagesTab extends Awesome private class AwesomeBarCursorItem implements AwesomeBarItem { private Cursor mCursor; public AwesomeBarCursorItem(Cursor cursor) { mCursor = cursor; } + @Override public void onClick() { AwesomeBarTabs.OnUrlOpenListener listener = getUrlListener(); if (listener == null) return; String url = mCursor.getString(mCursor.getColumnIndexOrThrow(URLColumns.URL)); String title = mCursor.getString(mCursor.getColumnIndexOrThrow(URLColumns.TITLE)); listener.onUrlOpen(url, title); } + @Override public ContextMenuSubject getSubject() { // Use the history id in order to allow removing history entries int id = mCursor.getInt(mCursor.getColumnIndexOrThrow(Combined.HISTORY_ID)); String keyword = null; int keywordCol = mCursor.getColumnIndex(URLColumns.KEYWORD); if (keywordCol != -1) keyword = mCursor.getString(keywordCol); @@ -284,22 +289,24 @@ public class AllPagesTab extends Awesome private class AwesomeBarSearchEngineItem implements AwesomeBarItem { private String mSearchEngine; public AwesomeBarSearchEngineItem(String searchEngine) { mSearchEngine = searchEngine; } + @Override public void onClick() { AwesomeBarTabs.OnUrlOpenListener listener = getUrlListener(); if (listener != null) listener.onSearch(mSearchEngine, mSearchTerm); } + @Override public ContextMenuSubject getSubject() { // Do not show context menu for search engine items return null; } } private class AwesomeBarCursorAdapter extends SimpleCursorAdapter { private static final int ROW_SEARCH = 0; @@ -453,16 +460,17 @@ public class AllPagesTab extends Awesome } return convertView; } private void bindSearchEngineView(final SearchEngine engine, final SearchEntryViewHolder viewHolder) { // when a suggestion is clicked, do a search OnClickListener clickListener = new OnClickListener() { + @Override public void onClick(View v) { AwesomeBarTabs.OnUrlOpenListener listener = getUrlListener(); if (listener != null) { String suggestion = ((TextView) v.findViewById(R.id.suggestion_text)).getText().toString(); // If we're not clicking the user-entered view (the // first suggestion item) and the search matches a URL // pattern, go to that URL. Otherwise, do a search for @@ -473,16 +481,17 @@ public class AllPagesTab extends Awesome listener.onSearch(engine.name, suggestion); } } } }; // when a suggestion is long-clicked, copy the suggestion into the URL EditText OnLongClickListener longClickListener = new OnLongClickListener() { + @Override public boolean onLongClick(View v) { AwesomeBarTabs.OnUrlOpenListener listener = getUrlListener(); if (listener != null) { String suggestion = ((TextView) v.findViewById(R.id.suggestion_text)).getText().toString(); listener.onEditSuggestion(suggestion); return true; } return false; @@ -620,16 +629,17 @@ public class AllPagesTab extends Awesome promptText.setText(getResources().getString(R.string.suggestions_prompt, mSearchEngines.get(0).name)); Tab tab = Tabs.getInstance().getSelectedTab(); if (tab != null) promptText.setPrivateMode(tab.isPrivate()); final View yesButton = mSuggestionsOptInPrompt.findViewById(R.id.suggestions_prompt_yes); final View noButton = mSuggestionsOptInPrompt.findViewById(R.id.suggestions_prompt_no); OnClickListener listener = new OnClickListener() { + @Override public void onClick(View v) { // Prevent the buttons from being clicked multiple times (bug 816902) yesButton.setOnClickListener(null); noButton.setOnClickListener(null); setSuggestionsEnabled(v == yesButton); } }; @@ -662,29 +672,33 @@ public class AllPagesTab extends Awesome mSuggestionsOptInPrompt.setAnimation(anim1); TranslateAnimation anim2 = new TranslateAnimation(0, 0, 0, -1 * mSuggestionsOptInPrompt.getHeight()); anim2.setDuration(ANIMATION_DURATION); anim2.setFillAfter(true); anim2.setStartOffset(anim1.getDuration()); final LinearLayout view = (LinearLayout)getView(); anim2.setAnimationListener(new Animation.AnimationListener() { + @Override public void onAnimationStart(Animation a) { // Increase the height of the view so a gap isn't shown during animation view.getLayoutParams().height = view.getHeight() + mSuggestionsOptInPrompt.getHeight(); view.requestLayout(); } + @Override public void onAnimationRepeat(Animation a) {} + @Override public void onAnimationEnd(Animation a) { // Removing the view immediately results in a NPE in // dispatchDraw(), possibly because this callback executes // before drawing is finished. Posting this as a Runnable fixes // the issue. view.post(new Runnable() { + @Override public void run() { view.removeView(mSuggestionsOptInPrompt); getListView().clearAnimation(); mSuggestionsOptInPrompt = null; if (enabled) { // Reset the view height view.getLayoutParams().height = LayoutParams.FILL_PARENT; @@ -698,19 +712,21 @@ public class AllPagesTab extends Awesome }); } }); mSuggestionsOptInPrompt.startAnimation(anim1); getListView().startAnimation(anim2); } + @Override public void handleMessage(String event, final JSONObject message) { if (event.equals("SearchEngines:Data")) { GeckoAppShell.getMainHandler().post(new Runnable() { + @Override public void run() { setSearchEngines(message); } }); } } public void handleItemClick(AdapterView<?> parent, View view, int position, long id) {
--- a/mobile/android/base/awesomebar/BookmarksTab.java +++ b/mobile/android/base/awesomebar/BookmarksTab.java @@ -62,16 +62,17 @@ public class BookmarksTab extends Awesom mView.setTag(TAG); mView.setOnTouchListener(mListListener); // We need to add the header before we set the adapter, hence make it null ListView list = (ListView)mView; list.setAdapter(null); list.setAdapter(getCursorAdapter()); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { handleItemClick(parent, view, position, id); } }); if (mShowReadingList) { String title = getResources().getString(R.string.bookmarks_folder_reading_list); getCursorAdapter().moveToChildFolder(Bookmarks.FIXED_READING_LIST_ID, title); @@ -363,16 +364,17 @@ public class BookmarksTab extends Awesom protected Cursor doInBackground(Void... arg0) { return BrowserDB.getBookmarksInFolder(getContentResolver(), mFolderId); } @Override protected void onPostExecute(final Cursor cursor) { // Hack: force this to the main thread, even though it should already be on it GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { // this will update the cursorAdapter to use the new one if it already exists // We need to add the header before we set the adapter, hence make it null ListView list = (ListView)mView; list.setAdapter(null); list.setAdapter(getCursorAdapter(cursor)); } });
--- a/mobile/android/base/awesomebar/HistoryTab.java +++ b/mobile/android/base/awesomebar/HistoryTab.java @@ -68,27 +68,29 @@ public class HistoryTab extends AwesomeB public ListView getView() { if (mView == null) { mView = LayoutInflater.from(mContext).inflate(R.layout.awesomebar_expandable_list, null); ((Activity)mContext).registerForContextMenu(mView); mView.setTag(TAG); ExpandableListView list = (ExpandableListView)mView; list.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { + @Override public boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int childPosition, long id) { return handleItemClick(groupPosition, childPosition); } }); // This is to disallow collapsing the expandable groups in the // history expandable list view to mimic simpler sections. We should // Remove this if we decide to allow expanding/collapsing groups. list.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { - public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { + @Override + public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { return true; } }); mView.setOnTouchListener(mListListener); // We need to add the header before we set the adapter, hence make it null list.setAdapter(getCursorAdapter()); @@ -362,16 +364,17 @@ public class HistoryTab extends AwesomeB }; BrowserDB.registerHistoryObserver(getContentResolver(), mContentObserver); } final ExpandableListView historyList = (ExpandableListView)getView(); // Hack: force this to the main thread, even though it should already be on it GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { historyList.setAdapter(mCursorAdapter); expandAllGroups(historyList); } }); mQueryTask = null; }
--- a/mobile/android/base/db/BrowserProvider.java.in +++ b/mobile/android/base/db/BrowserProvider.java.in @@ -323,16 +323,17 @@ public class BrowserProvider extends Con private HashMap<String, DatabaseHelper> mDatabasePerProfile; private interface BookmarkMigrator { public void updateForNewTable(ContentValues bookmark); } private class BookmarkMigrator3to4 implements BookmarkMigrator { + @Override public void updateForNewTable(ContentValues bookmark) { Integer isFolder = bookmark.getAsInteger("folder"); if (isFolder == null || isFolder != 1) { bookmark.put(Bookmarks.TYPE, Bookmarks.TYPE_BOOKMARK); } else { bookmark.put(Bookmarks.TYPE, Bookmarks.TYPE_FOLDER); } @@ -1024,16 +1025,17 @@ public class BrowserProvider extends Con // return early if there is no icon for this bookmark if (!bookmark.has("icon")) { continue; } // create icons in a separate thread to avoid blocking about:home on startup GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { try { String iconData = bookmark.getString("icon"); Bitmap icon = BitmapUtils.getBitmapFromDataURI(iconData); if (icon != null) { createFavicon(db, url, icon); } } catch (JSONException e) { @@ -1066,16 +1068,17 @@ public class BrowserProvider extends Con Field urlField = stringsClass.getField(name.replace("_title_", "_url_")); int urlId = urlField.getInt(null); final String url = mContext.getString(urlId); createBookmark(db, title, url, pos); // create icons in a separate thread to avoid blocking about:home on startup GeckoBackgroundThread.getHandler().post(new Runnable() { + @Override public void run() { Bitmap icon = getDefaultFaviconFromPath(name); if (icon == null) { icon = getDefaultFaviconFromDrawable(name); } if (icon != null) { createFavicon(db, url, icon); }
--- a/mobile/android/base/db/LocalBrowserDB.java +++ b/mobile/android/base/db/LocalBrowserDB.java @@ -92,16 +92,17 @@ public class LocalBrowserDB implements B appendQueryParameter(BrowserContract.PARAM_SHOW_DELETED, "1").build(); mUpdateHistoryUriWithProfile = mHistoryUriWithProfile.buildUpon(). appendQueryParameter(BrowserContract.PARAM_INCREMENT_VISITS, "true"). appendQueryParameter(BrowserContract.PARAM_INSERT_IF_NEEDED, "true").build(); } // Invalidate cached data + @Override public void invalidateCachedState() { mDesktopBookmarksExist = null; mReadingListItemsExist = null; } private Uri historyUriWithLimit(int limit) { return mHistoryUriWithProfile.buildUpon().appendQueryParameter(BrowserContract.PARAM_LIMIT, String.valueOf(limit)).build(); @@ -177,16 +178,17 @@ public class LocalBrowserDB implements B projection, selection, selectionArgs, sortOrder); return new LocalDBCursor(c); } + @Override public int getCount(ContentResolver cr, String database) { Cursor cursor = null; int count = 0; String[] columns = null; String constraint = null; try { Uri uri = null; if ("history".equals(database)) { @@ -212,29 +214,31 @@ public class LocalBrowserDB implements B } finally { if (cursor != null) cursor.close(); } debug("Got count " + count + " for " + database); return count; } + @Override public Cursor filter(ContentResolver cr, CharSequence constraint, int limit) { return filterAllSites(cr, new String[] { Combined._ID, Combined.URL, Combined.TITLE, Combined.DISPLAY, Combined.BOOKMARK_ID, Combined.HISTORY_ID }, constraint, limit, null); } + @Override public Cursor getTopSites(ContentResolver cr, int limit) { // Filter out sites that are pinned String selection = DBUtils.concatenateWhere("", Combined.URL + " NOT IN (SELECT " + Bookmarks.URL + " FROM bookmarks WHERE bookmarks." + Bookmarks.PARENT + " == ?)"); String[] selectionArgs = DBUtils.appendSelectionArgs(new String[0], new String[] { String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID) }); return filterAllSites(cr, new String[] { Combined._ID, @@ -242,41 +246,44 @@ public class LocalBrowserDB implements B Combined.TITLE }, "", limit, BrowserDB.ABOUT_PAGES_URL_FILTER, selection, selectionArgs); } + @Override public void updateVisitedHistory(ContentResolver cr, String uri) { ContentValues values = new ContentValues(); values.put(History.URL, uri); values.put(History.DATE_LAST_VISITED, System.currentTimeMillis()); values.put(History.IS_DELETED, 0); // This will insert a new history entry if one for this URL // doesn't already exist cr.update(mUpdateHistoryUriWithProfile, values, History.URL + " = ?", new String[] { uri }); } + @Override public void updateHistoryTitle(ContentResolver cr, String uri, String title) { ContentValues values = new ContentValues(); values.put(History.TITLE, title); cr.update(mHistoryUriWithProfile, values, History.URL + " = ?", new String[] { uri }); } + @Override public void updateHistoryEntry(ContentResolver cr, String uri, String title, long date, int visits) { int oldVisits = 0; Cursor cursor = null; try { cursor = cr.query(mHistoryUriWithProfile, new String[] { History.VISITS }, History.URL + " = ?", @@ -299,26 +306,28 @@ public class LocalBrowserDB implements B } cr.update(mHistoryUriWithProfile, values, History.URL + " = ?", new String[] { uri }); } + @Override public Cursor getAllVisitedHistory(ContentResolver cr) { Cursor c = cr.query(mHistoryUriWithProfile, new String[] { History.URL }, History.VISITS + " > 0", null, null); return new LocalDBCursor(c); } + @Override public Cursor getRecentHistory(ContentResolver cr, int limit) { Cursor c = cr.query(combinedUriWithLimit(limit), new String[] { Combined._ID, Combined.BOOKMARK_ID, Combined.HISTORY_ID, Combined.URL, Combined.TITLE, Combined.FAVICON, @@ -327,38 +336,43 @@ public class LocalBrowserDB implements B Combined.VISITS }, History.DATE_LAST_VISITED + " > 0", null, History.DATE_LAST_VISITED + " DESC"); return new LocalDBCursor(c); } + @Override public void expireHistory(ContentResolver cr, ExpirePriority priority) { Uri url = mHistoryExpireUriWithProfile; url = url.buildUpon().appendQueryParameter(BrowserContract.PARAM_EXPIRE_PRIORITY, priority.toString()).build(); cr.delete(url, null, null); } + @Override public void removeHistoryEntry(ContentResolver cr, int id) { cr.delete(mHistoryUriWithProfile, History._ID + " = ?", new String[] { String.valueOf(id) }); } + @Override public void removeHistoryEntry(ContentResolver cr, String url) { int deleted = cr.delete(mHistoryUriWithProfile, History.URL + " = ?", new String[] { url }); } + @Override public void clearHistory(ContentResolver cr) { cr.delete(mHistoryUriWithProfile, null, null); } + @Override public Cursor getBookmarksInFolder(ContentResolver cr, long folderId) { Cursor c = null; boolean addDesktopFolder = false; boolean addReadingListFolder = false; // We always want to show mobile bookmarks in the root view. if (folderId == Bookmarks.FIXED_ROOT_ID) { folderId = getFolderIdFromGuid(cr, Bookmarks.MOBILE_FOLDER_GUID); @@ -452,16 +466,17 @@ public class LocalBrowserDB implements B c.close(); } // Cache result for future queries mReadingListItemsExist = (count > 0); return mReadingListItemsExist; } + @Override public boolean isBookmark(ContentResolver cr, String uri) { // This method is about normal bookmarks, not the Reading List int count = 0; try { Cursor c = cr.query(bookmarksUriWithLimit(1), new String[] { Bookmarks._ID }, Bookmarks.URL + " = ? AND " + Bookmarks.PARENT + " != ? AND " + @@ -474,16 +489,17 @@ public class LocalBrowserDB implements B c.close(); } catch (NullPointerException e) { Log.e(LOGTAG, "NullPointerException in isBookmark"); } return (count > 0); } + @Override public boolean isReadingListItem(ContentResolver cr, String uri) { int count = 0; try { Cursor c = cr.query(mBookmarksUriWithProfile, new String[] { Bookmarks._ID }, Bookmarks.URL + " = ? AND " + Bookmarks.PARENT + " == ?", new String[] { uri, @@ -494,16 +510,17 @@ public class LocalBrowserDB implements B c.close(); } catch (NullPointerException e) { Log.e(LOGTAG, "NullPointerException in isReadingListItem"); } return (count > 0); } + @Override public String getUrlForKeyword(ContentResolver cr, String keyword) { Cursor cursor = cr.query(mBookmarksUriWithProfile, new String[] { Bookmarks.URL }, Bookmarks.KEYWORD + " = ?", new String[] { keyword }, null); if (!cursor.moveToFirst()) { @@ -596,83 +613,92 @@ public class LocalBrowserDB implements B ContentValues bumped = new ContentValues(); bumped.put(Bookmarks.DATE_MODIFIED, now); updated = cr.update(mBookmarksUriWithProfile, bumped, where, args); debug("Updated " + updated + " rows to new modified time."); } + @Override public void addBookmark(ContentResolver cr, String title, String uri) { long folderId = getFolderIdFromGuid(cr, Bookmarks.MOBILE_FOLDER_GUID); addBookmarkItem(cr, title, uri, folderId); } + @Override public void removeBookmark(ContentResolver cr, int id) { Uri contentUri = mBookmarksUriWithProfile; // Do this now so that the item still exists! final String idString = String.valueOf(id); bumpParents(cr, Bookmarks._ID, idString); final String[] idArgs = new String[] { idString }; final String idEquals = Bookmarks._ID + " = ?"; cr.delete(contentUri, idEquals, idArgs); } + @Override public void removeBookmarksWithURL(ContentResolver cr, String uri) { Uri contentUri = mBookmarksUriWithProfile; // Do this now so that the items still exist! bumpParents(cr, Bookmarks.URL, uri); // Toggling bookmark on an URL should not affect the items in the reading list final String[] urlArgs = new String[] { uri, String.valueOf(Bookmarks.FIXED_READING_LIST_ID) }; final String urlEquals = Bookmarks.URL + " = ? AND " + Bookmarks.PARENT + " != ?"; cr.delete(contentUri, urlEquals, urlArgs); } + @Override public void addReadingListItem(ContentResolver cr, String title, String uri) { addBookmarkItem(cr, title, uri, Bookmarks.FIXED_READING_LIST_ID); } + @Override public void removeReadingListItemWithURL(ContentResolver cr, String uri) { Uri contentUri = mBookmarksUriWithProfile; // Do this now so that the items still exist! bumpParents(cr, Bookmarks.URL, uri); final String[] urlArgs = new String[] { uri, String.valueOf(Bookmarks.FIXED_READING_LIST_ID) }; final String urlEquals = Bookmarks.URL + " = ? AND " + Bookmarks.PARENT + " == ?"; cr.delete(contentUri, urlEquals, urlArgs); } + @Override public void registerBookmarkObserver(ContentResolver cr, ContentObserver observer) { cr.registerContentObserver(mBookmarksUriWithProfile, false, observer); } + @Override public void registerHistoryObserver(ContentResolver cr, ContentObserver observer) { cr.registerContentObserver(mHistoryUriWithProfile, false, observer); } + @Override public void updateBookmark(ContentResolver cr, int id, String uri, String title, String keyword) { ContentValues values = new ContentValues(); values.put(Browser.BookmarkColumns.TITLE, title); values.put(Bookmarks.URL, uri); values.put(Bookmarks.KEYWORD, keyword); values.put(Bookmarks.DATE_MODIFIED, System.currentTimeMillis()); cr.update(mBookmarksUriWithProfile, values, Bookmarks._ID + " = ?", new String[] { String.valueOf(id) }); } + @Override public Bitmap getFaviconForUrl(ContentResolver cr, String uri) { Cursor c = cr.query(mCombinedUriWithProfile, new String[] { Combined.FAVICON }, Combined.URL + " = ?", new String[] { uri }, null); if (!c.moveToFirst()) { @@ -686,16 +712,17 @@ public class LocalBrowserDB implements B c.close(); if (b == null) return null; return BitmapFactory.decodeByteArray(b, 0, b.length); } + @Override public String getFaviconUrlForHistoryUrl(ContentResolver cr, String uri) { Cursor c = cr.query(mHistoryUriWithProfile, new String[] { History.FAVICON_URL }, Combined.URL + " = ?", new String[] { uri }, null); if (!c.moveToFirst()) { @@ -704,16 +731,17 @@ public class LocalBrowserDB implements B } String faviconUrl = c.getString(c.getColumnIndexOrThrow(History.FAVICON_URL)); c.close(); return faviconUrl; } + @Override public Cursor getFaviconsForUrls(ContentResolver cr, List<String> urls) { StringBuffer selection = new StringBuffer(); String[] selectionArgs = new String[urls.size()]; for (int i = 0; i < urls.size(); i++) { final String url = urls.get(i); if (i > 0) @@ -725,16 +753,17 @@ public class LocalBrowserDB implements B return cr.query(mCombinedUriWithProfile, new String[] { Combined.URL, Combined.FAVICON }, selection.toString(), selectionArgs, null); } + @Override public void updateFaviconForUrl(ContentResolver cr, String pageUri, Bitmap favicon, String faviconUri) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); favicon.compress(Bitmap.CompressFormat.PNG, 100, stream); ContentValues values = new ContentValues(); values.put(Favicons.URL, faviconUri); values.put(Favicons.DATA, stream.toByteArray()); @@ -748,16 +777,17 @@ public class LocalBrowserDB implements B values, Favicons.URL + " = ?", new String[] { faviconUri }); if (updated == 0) cr.insert(mFaviconsUriWithProfile, values); } + @Override public void updateThumbnailForUrl(ContentResolver cr, String uri, BitmapDrawable thumbnail) { Bitmap bitmap = thumbnail.getBitmap(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream); ContentValues values = new ContentValues(); @@ -768,16 +798,17 @@ public class LocalBrowserDB implements B values, Thumbnails.URL + " = ?", new String[] { uri }); if (updated == 0) cr.insert(mThumbnailsUriWithProfile, values); } + @Override public byte[] getThumbnailForUrl(ContentResolver cr, String uri) { Cursor c = cr.query(mThumbnailsUriWithProfile, new String[] { Thumbnails.DATA }, Thumbnails.URL + " = ?", new String[] { uri }, null); if (!c.moveToFirst()) { @@ -788,16 +819,17 @@ public class LocalBrowserDB implements B int thumbnailIndex = c.getColumnIndexOrThrow(Thumbnails.DATA); byte[] b = c.getBlob(thumbnailIndex); c.close(); return b; } + @Override public Cursor getThumbnailsForUrls(ContentResolver cr, List<String> urls) { StringBuffer selection = new StringBuffer(); String[] selectionArgs = new String[urls.size()]; for (int i = 0; i < urls.size(); i++) { final String url = urls.get(i); if (i > 0) @@ -809,16 +841,17 @@ public class LocalBrowserDB implements B return cr.query(mThumbnailsUriWithProfile, new String[] { Thumbnails.URL, Thumbnails.DATA }, selection.toString(), selectionArgs, null); } + @Override public void removeThumbnails(ContentResolver cr) { cr.delete(mThumbnailsUriWithProfile, null, null); } // Utility function for updating existing history using batch operations public void updateHistoryInBatch(ContentResolver cr, Collection<ContentProviderOperation> operations, String url, String title, @@ -1103,16 +1136,17 @@ public class LocalBrowserDB implements B @Override public int getColumnIndexOrThrow(String columnName) { return super.getColumnIndexOrThrow(translateColumnName(columnName)); } } + @Override public void pinSite(ContentResolver cr, String url, String title, int position) { ContentValues values = new ContentValues(); final long now = System.currentTimeMillis(); values.put(Bookmarks.TITLE, title); values.put(Bookmarks.URL, url); values.put(Bookmarks.PARENT, Bookmarks.FIXED_PINNED_LIST_ID); values.put(Bookmarks.DATE_MODIFIED, now); values.put(Bookmarks.POSITION, position); @@ -1135,44 +1169,48 @@ public class LocalBrowserDB implements B String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID) }); // Otherwise just insert a new item if (updated == 0) { cr.insert(mBookmarksUriWithProfile, values); } } + @Override public Cursor getPinnedSites(ContentResolver cr, int limit) { return cr.query(bookmarksUriWithLimit(limit), new String[] { Bookmarks._ID, Bookmarks.URL, Bookmarks.TITLE, Bookmarks.POSITION }, Bookmarks.PARENT + " == ?", new String[] { String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID) }, Bookmarks.POSITION + " ASC"); } + @Override public void unpinSite(ContentResolver cr, int position) { cr.delete(mBookmarksUriWithProfile, Bookmarks.PARENT + " == ? AND " + Bookmarks.POSITION + " = ?", new String[] { String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID), Integer.toString(position) }); } + @Override public void unpinAllSites(ContentResolver cr) { cr.delete(mBookmarksUriWithProfile, Bookmarks.PARENT + " == ?", new String[] { String.valueOf(Bookmarks.FIXED_PINNED_LIST_ID) }); } + @Override public boolean isVisited(ContentResolver cr, String uri) { int count = 0; try { Cursor c = cr.query(historyUriWithLimit(1), new String[] { History._ID }, History.URL + " = ?", new String[] { uri }, History.URL);
--- a/mobile/android/base/db/TabsProvider.java.in +++ b/mobile/android/base/db/TabsProvider.java.in @@ -289,16 +289,17 @@ public class TabsProvider extends Conten return getDatabaseHelperForProfile(profile).getWritableDatabase(); } @Override public boolean onCreate() { debug("Creating TabsProvider"); GeckoBackgroundThread.post(new Runnable() { + @Override public void run() { // Kick this off early. It is synchronized so that other callers will wait try { GeckoProfile.get(getContext()).getDir(); } catch (Exception ex) { Log.e(LOGTAG, "Error getting profile dir", ex); } }
--- a/mobile/android/base/gfx/GLController.java +++ b/mobile/android/base/gfx/GLController.java @@ -86,16 +86,17 @@ public class GLController { throw new GLControllerException("eglGetDisplay() failed"); } mEGLConfig = chooseConfig(); // updating the state in the view/controller/client should be // done on the main UI thread, not the GL renderer thread mView.post(new Runnable() { + @Override public void run() { mView.setViewportSize(mWidth, mHeight); } }); } private EGLConfig chooseConfig() { int[] numConfigs = new int[1];
--- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -232,16 +232,17 @@ public class GeckoLayerClient implements return; mViewportMetrics = mViewportMetrics.setPageRect(rect, cssRect); // Page size is owned by the layer client, so no need to notify it of // this change. post(new Runnable() { + @Override public void run() { mPanZoomController.pageRectUpdated(); mView.requestRender(); } }); } private void adjustViewport(DisplayPortMetrics displayPort) { @@ -261,16 +262,17 @@ public class GeckoLayerClient implements GeckoAppShell.sendEventToGecko(GeckoEvent.createViewportEvent(clampedMetrics, displayPort)); } /** Aborts any pan/zoom animation that is currently in progress. */ private void abortPanZoomAnimation() { if (mPanZoomController != null) { post(new Runnable() { + @Override public void run() { mPanZoomController.abortAnimation(); } }); } } /** @@ -304,16 +306,17 @@ public class GeckoLayerClient implements // and our zoom level (which may have diverged). float scaleFactor = oldMetrics.zoomFactor / messageMetrics.zoomFactor; metrics = oldMetrics.setPageRect(RectUtils.scale(messageMetrics.getPageRect(), scaleFactor), messageMetrics.getCssPageRect()); break; } final ImmutableViewportMetrics newMetrics = metrics; post(new Runnable() { + @Override public void run() { mGeckoViewport = newMetrics; } }); setViewportMetrics(newMetrics, type == ViewportMessageType.UPDATE); mDisplayPort = DisplayPortCalculator.calculate(getViewportMetrics(), null); } return mDisplayPort; @@ -451,16 +454,17 @@ public class GeckoLayerClient implements .setZoomFactor(zoom) .setPageRect(new RectF(pageLeft, pageTop, pageRight, pageBottom), new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom)); // Since we have switched to displaying a different document, we need to update any // viewport-related state we have lying around. This includes mGeckoViewport and // mViewportMetrics. Usually this information is updated via handleViewportMessage // while we remain on the same document. post(new Runnable() { + @Override public void run() { mGeckoViewport = newMetrics; } }); setViewportMetrics(newMetrics); Tab tab = Tabs.getInstance().getSelectedTab(); mView.setBackgroundColor(tab.getBackgroundColor()); @@ -574,156 +578,172 @@ public class GeckoLayerClient implements /* Let Gecko know if the screensize has changed */ sendResizeEventIfNecessary(false); if (getRedrawHint()) { adjustViewport(null); } } /** Implementation of LayerView.Listener */ + @Override public void renderRequested() { try { GeckoAppShell.scheduleComposite(); } catch (UnsupportedOperationException uoe) { // In some very rare cases this gets called before libxul is loaded, // so catch and ignore the exception that will throw. See bug 837821 Log.d(LOGTAG, "Dropping renderRequested call before libxul load."); } } /** Implementation of LayerView.Listener */ + @Override public void compositionPauseRequested() { // We need to coordinate with Gecko when pausing composition, to ensure // that Gecko never executes a draw event while the compositor is paused. // This is sent synchronously to make sure that we don't attempt to use // any outstanding Surfaces after we call this (such as from a // surfaceDestroyed notification), and to make sure that any in-flight // Gecko draw events have been processed. When this returns, composition is // definitely paused -- it'll synchronize with the Gecko event loop, which // in turn will synchronize with the compositor thread. if (mCompositorCreated) { GeckoAppShell.sendEventToGeckoSync(GeckoEvent.createCompositorPauseEvent()); } } /** Implementation of LayerView.Listener */ + @Override public void compositionResumeRequested(int width, int height) { // Asking Gecko to resume the compositor takes too long (see // https://bugzilla.mozilla.org/show_bug.cgi?id=735230#c23), so we // resume the compositor directly. We still need to inform Gecko about // the compositor resuming, so that Gecko knows that it can now draw. if (mCompositorCreated) { GeckoAppShell.scheduleResumeComposition(width, height); GeckoAppShell.sendEventToGecko(GeckoEvent.createCompositorResumeEvent()); } } /** Implementation of LayerView.Listener */ + @Override public void sizeChanged(int width, int height) { // We need to make sure a draw happens synchronously at this point, // but resizing the surface before the SurfaceView has resized will // cause a visible jump. compositionResumeRequested(mWindowSize.width, mWindowSize.height); } /** Implementation of LayerView.Listener */ + @Override public void surfaceChanged(int width, int height) { setViewportSize(width, height); // We need to make this call even when the compositor isn't currently // paused (e.g. during an orientation change), to make the compositor // aware of the changed surface. compositionResumeRequested(width, height); } /** Implementation of LayerView.Listener */ + @Override public void compositorCreated() { mCompositorCreated = true; } /** Implementation of PanZoomTarget */ + @Override public ImmutableViewportMetrics getViewportMetrics() { return mViewportMetrics; } /** Implementation of PanZoomTarget */ + @Override public ZoomConstraints getZoomConstraints() { return mZoomConstraints; } /** Implementation of PanZoomTarget */ + @Override public boolean isFullScreen() { return mView.isFullScreen(); } /** Implementation of PanZoomTarget */ + @Override public void setAnimationTarget(ImmutableViewportMetrics metrics) { if (mGeckoIsReady) { // We know what the final viewport of the animation is going to be, so // immediately request a draw of that area by setting the display port // accordingly. This way we should have the content pre-rendered by the // time the animation is done. DisplayPortMetrics displayPort = DisplayPortCalculator.calculate(metrics, null); adjustViewport(displayPort); } } /** Implementation of PanZoomTarget * You must hold the monitor while calling this. */ + @Override public void setViewportMetrics(ImmutableViewportMetrics metrics) { setViewportMetrics(metrics, true); } private void setViewportMetrics(ImmutableViewportMetrics metrics, boolean notifyGecko) { mViewportMetrics = metrics; mView.requestRender(); if (notifyGecko && mGeckoIsReady) { geometryChanged(); } setShadowVisibility(); } private void setShadowVisibility() { GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { if (BrowserApp.mBrowserToolbar == null) { return; } ImmutableViewportMetrics m = mViewportMetrics; BrowserApp.mBrowserToolbar.setShadowVisibility(m.viewportRectTop >= m.pageRectTop); } }); } /** Implementation of PanZoomTarget */ + @Override public void forceRedraw() { mForceRedraw = true; if (mGeckoIsReady) { geometryChanged(); } } /** Implementation of PanZoomTarget */ + @Override public boolean post(Runnable action) { return mView.post(action); } /** Implementation of PanZoomTarget */ + @Override public Object getLock() { return this; } /** Implementation of PanZoomTarget * Converts a point from layer view coordinates to layer coordinates. In other words, given a * point measured in pixels from the top left corner of the layer view, returns the point in * pixels measured from the last scroll position we sent to Gecko, in CSS pixels. Assuming the * events being sent to Gecko are processed in FIFO order, this calculation should always be * correct. */ + @Override public PointF convertViewPointToLayerPoint(PointF viewPoint) { if (!mGeckoIsReady) { return null; } ImmutableViewportMetrics viewportMetrics = mViewportMetrics; PointF origin = viewportMetrics.getOrigin(); float zoom = viewportMetrics.zoomFactor;
--- a/mobile/android/base/gfx/JavaPanZoomController.java +++ b/mobile/android/base/gfx/JavaPanZoomController.java @@ -117,16 +117,17 @@ class JavaPanZoomController mEventDispatcher = eventDispatcher; registerEventListener(MESSAGE_ZOOM_RECT); registerEventListener(MESSAGE_ZOOM_PAGE); registerEventListener(MESSAGE_TOUCH_LISTENER); Axis.initPrefs(); } + @Override public void destroy() { unregisterEventListener(MESSAGE_ZOOM_RECT); unregisterEventListener(MESSAGE_ZOOM_PAGE); unregisterEventListener(MESSAGE_TOUCH_LISTENER); mSubscroller.destroy(); mTouchEventHandler.destroy(); } @@ -159,25 +160,27 @@ class JavaPanZoomController // for debugging bug 713011; it can be taken out once that is resolved. private void checkMainThread() { if (mMainThread != Thread.currentThread()) { // log with full stack trace Log.e(LOGTAG, "Uh-oh, we're running on the wrong thread!", new Exception()); } } + @Override public void handleMessage(String event, JSONObject message) { try { if (MESSAGE_ZOOM_RECT.equals(event)) { float x = (float)message.getDouble("x"); float y = (float)message.getDouble("y"); final RectF zoomRect = new RectF(x, y, x + (float)message.getDouble("w"), y + (float)message.getDouble("h")); mTarget.post(new Runnable() { + @Override public void run() { animatedZoomTo(zoomRect); } }); } else if (MESSAGE_ZOOM_PAGE.equals(event)) { ImmutableViewportMetrics metrics = getMetrics(); RectF cssPageRect = metrics.getCssPageRect(); @@ -186,73 +189,79 @@ class JavaPanZoomController // attempt to keep zoom keep focused on the center of the viewport float newHeight = viewableRect.height() * cssPageRect.width() / viewableRect.width(); float dh = viewableRect.height() - newHeight; // increase in the height final RectF r = new RectF(0.0f, y + dh/2, cssPageRect.width(), y + dh/2 + newHeight); mTarget.post(new Runnable() { + @Override public void run() { animatedZoomTo(r); } }); } else if (MESSAGE_TOUCH_LISTENER.equals(event)) { int tabId = message.getInt("tabID"); final Tab tab = Tabs.getInstance().getTab(tabId); tab.setHasTouchListeners(true); mTarget.post(new Runnable() { + @Override public void run() { if (Tabs.getInstance().isSelectedTab(tab)) mTouchEventHandler.setWaitForTouchListeners(true); } }); } } catch (Exception e) { Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e); } } /** This function MUST be called on the UI thread */ + @Override public boolean onMotionEvent(MotionEvent event) { if (Build.VERSION.SDK_INT <= 11) { return false; } switch (event.getSource() & InputDevice.SOURCE_CLASS_MASK) { case InputDevice.SOURCE_CLASS_POINTER: switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_SCROLL: return handlePointerScroll(event); } break; } return false; } /** This function MUST be called on the UI thread */ + @Override public boolean onTouchEvent(MotionEvent event) { return mTouchEventHandler.handleEvent(event); } boolean handleEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: return handleTouchStart(event); case MotionEvent.ACTION_MOVE: return handleTouchMove(event); case MotionEvent.ACTION_UP: return handleTouchEnd(event); case MotionEvent.ACTION_CANCEL: return handleTouchCancel(event); } return false; } /** This function MUST be called on the UI thread */ + @Override public void notifyDefaultActionPrevented(boolean prevented) { mTouchEventHandler.handleEventListenerAction(!prevented); } /** This function must be called from the UI thread. */ + @Override public void abortAnimation() { checkMainThread(); // this happens when gecko changes the viewport on us or if the device is rotated. // if that's the case, abort any animation in progress and re-zoom so that the page // snaps to edges. for other cases (where the user's finger(s) are down) don't do // anything special. switch (mState) { case FLING: @@ -295,16 +304,17 @@ class JavaPanZoomController // if we enter here, we just finished a block of events whose default actions // were prevented by touch listeners. Now there are no touch points left, so // we need to reset our state and re-bounce because we might be in overscroll bounce(); } } /** This must be called on the UI thread. */ + @Override public void pageRectUpdated() { if (mState == PanZoomState.NOTHING) { synchronized (mTarget.getLock()) { ImmutableViewportMetrics validated = getValidViewportMetrics(); if (!getMetrics().fuzzyEquals(validated)) { // page size changed such that we are now in overscroll. snap to the // the nearest valid viewport mTarget.setViewportMetrics(validated); @@ -612,16 +622,17 @@ class JavaPanZoomController } private float getVelocity() { float xvel = mX.getRealVelocity(); float yvel = mY.getRealVelocity(); return FloatMath.sqrt(xvel * xvel + yvel * yvel); } + @Override public PointF getVelocityVector() { return new PointF(mX.getRealVelocity(), mY.getRealVelocity()); } private boolean stopped() { return getVelocity() < STOPPED_THRESHOLD; } @@ -642,16 +653,17 @@ class JavaPanZoomController } } } private abstract class AnimationRunnable implements Runnable { private boolean mAnimationTerminated; /* This should always run on the UI thread */ + @Override public final void run() { /* * Since the animation timer queues this runnable on the UI thread, it * is possible that even when the animation timer is cancelled, there * are multiple instances of this queued, so we need to have another * mechanism to abort. This is done by using the mAnimationTerminated flag. */ if (mAnimationTerminated) { @@ -991,16 +1003,17 @@ class JavaPanZoomController * scale operation. You must hold the monitor while calling this. */ private void scaleWithFocus(float zoomFactor, PointF focus) { ImmutableViewportMetrics viewportMetrics = getMetrics(); viewportMetrics = viewportMetrics.scaleTo(zoomFactor, focus); mTarget.setViewportMetrics(viewportMetrics); } + @Override public boolean getRedrawHint() { switch (mState) { case PINCHING: case ANIMATED_ZOOM: case BOUNCE: // don't redraw during these because the zoom is (or might be, in the case // of BOUNCE) be changing rapidly and gecko will have to redraw the entire // display port area. we trigger a force-redraw upon exiting these states. @@ -1107,22 +1120,25 @@ class JavaPanZoomController // clamped down to prevent overscroll, over-zoom, and other bad conditions. finalMetrics = getValidViewportMetrics(finalMetrics); bounce(finalMetrics, PanZoomState.ANIMATED_ZOOM); return true; } /** This function must be called from the UI thread. */ + @Override public void abortPanning() { checkMainThread(); bounce(); } + @Override public void setOverScrollMode(int overscrollMode) { mX.setOverScrollMode(overscrollMode); mY.setOverScrollMode(overscrollMode); } + @Override public int getOverScrollMode() { return mX.getOverScrollMode(); } }
--- a/mobile/android/base/gfx/LayerRenderer.java +++ b/mobile/android/base/gfx/LayerRenderer.java @@ -380,16 +380,17 @@ public class LayerRenderer implements Ta } mView.postDelayed(this, 1000L / 60L); // request another frame at 60fps } boolean timeToFade() { return !mStarted; } + @Override public void run() { long timeDelta = mRunAt - SystemClock.elapsedRealtime(); if (timeDelta > 0) { // the run-at time was pushed back, so reschedule mView.postDelayed(this, timeDelta); } else { // reached the run-at time, execute mStarted = false; @@ -625,16 +626,17 @@ public class LayerRenderer implements Ta } } // Remove background color once we've painted. GeckoLayerClient is // responsible for setting this flag before current document is // composited. if (mView.getPaintState() == LayerView.PAINT_BEFORE_FIRST) { mView.post(new Runnable() { + @Override public void run() { mView.getChildAt(0).setBackgroundColor(Color.TRANSPARENT); } }); mView.setPaintState(LayerView.PAINT_AFTER_FIRST); } } }
--- a/mobile/android/base/gfx/LayerView.java +++ b/mobile/android/base/gfx/LayerView.java @@ -127,16 +127,17 @@ public class LayerView extends FrameLayo mRenderer.destroy(); } } public void setTouchIntercepter(final OnInterceptTouchListener touchIntercepter) { // this gets run on the gecko thread, but for thread safety we want the assignment // on the UI thread. post(new Runnable() { + @Override public void run() { mTouchIntercepter = touchIntercepter; } }); } @Override public boolean onTouchEvent(MotionEvent event) { @@ -423,24 +424,27 @@ public class LayerView extends FrameLayo void renderRequested(); void compositionPauseRequested(); void compositionResumeRequested(int width, int height); void sizeChanged(int width, int height); void surfaceChanged(int width, int height); } private class SurfaceListener implements SurfaceHolder.Callback { + @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { onSizeChanged(width, height); } + @Override public void surfaceCreated(SurfaceHolder holder) { } + @Override public void surfaceDestroyed(SurfaceHolder holder) { onDestroyed(); } } /* A subclass of SurfaceView to listen to layout changes, as * View.OnLayoutChangeListener requires API level 11. */
--- a/mobile/android/base/gfx/PluginLayer.java +++ b/mobile/android/base/gfx/PluginLayer.java @@ -56,26 +56,28 @@ public class PluginLayer extends TileLay } else { hideView(); } } private void hideView() { if (mViewVisible) { GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { mView.setVisibility(View.GONE); mViewVisible = false; } }); } } public void showView() { GeckoApp.mAppContext.mMainHandler.post(new Runnable() { + @Override public void run() { if (mContainer.indexOfChild(mView) < 0) { mContainer.addView(mView, mLayoutParams); } else { mContainer.updateViewLayout(mView, mLayoutParams); mView.setVisibility(View.VISIBLE); } mViewVisible = true;
--- a/mobile/android/base/gfx/SubdocumentScrollHelper.java +++ b/mobile/android/base/gfx/SubdocumentScrollHelper.java @@ -113,19 +113,21 @@ class SubdocumentScrollHelper implements } boolean lastScrollSucceeded() { return mScrollSucceeded; } // GeckoEventListener implementation + @Override public void handleMessage(final String event, final JSONObject message) { // this comes in on the gecko thread; hand off the handling to the UI thread mUiHandler.post(new Runnable() { + @Override public void run() { Log.i(LOGTAG, "Got message: " + event); try { if (MESSAGE_PANNING_OVERRIDE.equals(event)) { mOverridePanning = true; mOverrideScrollAck = true; mOverrideScrollPending = false; mScrollSucceeded = true;
--- a/mobile/android/base/gfx/TouchEventHandler.java +++ b/mobile/android/base/gfx/TouchEventHandler.java @@ -294,28 +294,30 @@ final class TouchEventHandler implements // pop the event we peeked above, as it is still part of the block and // we want to keep processing mEventQueue.remove(); } } private class ListenerTimeoutProcessor implements Runnable { /* This MUST be run on the UI thread */ + @Override public void run() { if (mProcessingBalance < 0) { // gecko already responded with default-prevented notification, and so // the block of events this ListenerTimeoutProcessor corresponds to have // already been removed from the queue. } else { processEventBlock(true); } mProcessingBalance++; } } // Tabs.OnTabsChangedListener implementation + @Override public void onTabChanged(Tab tab, Tabs.TabEvents msg, Object data) { if ((Tabs.getInstance().isSelectedTab(tab) && msg == Tabs.TabEvents.STOP) || msg == Tabs.TabEvents.SELECTED) { mWaitForTouchListeners = tab.getHasTouchListeners(); } } }
--- a/mobile/android/base/tests/BaseTest.java.in +++ b/mobile/android/base/tests/BaseTest.java.in @@ -238,16 +238,17 @@ abstract class BaseTest extends Activity class VerifyUrlTest implements BooleanTest { private Element mUrlbar; private String mUrl; public VerifyUrlTest(Element urlbar, String url) { mUrlbar = urlbar; mUrl = url; } + @Override public boolean test() { String urlbarText = mUrlbar.getText(); if (urlbarText.equals(mUrl)) { return true; } return false; } } @@ -372,16 +373,17 @@ abstract class BaseTest extends Activity class VerifyTitle implements BooleanTest { private Element mAwesomebar; private String mTitle; public VerifyTitle(Element awesomebar, String title) { mAwesomebar = awesomebar; mTitle = title; } + @Override public boolean test() { String pageTitle = mAwesomebar.getText(); if (pageTitle.equals(mTitle)) { return true; } return false; } } @@ -518,16 +520,17 @@ abstract class BaseTest extends Activity Activity activity = getActivity(); tabs = mDriver.findElement(activity, "tabs"); addTab = mDriver.findElement(activity, "add_tab"); final int addTabId = addTab.getId(); mAsserter.ok(tabs.click(), "checking that tabs clicked", "tabs element clicked"); // wait for addTab to appear (this is usually immediate) boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { View addTabView = getActivity().findViewById(addTabId); if (addTabView == null) { return false; } return true; } }, MAX_WAIT_MS);
--- a/mobile/android/base/tests/testBookmark.java.in +++ b/mobile/android/base/tests/testBookmark.java.in @@ -108,16 +108,17 @@ public class testBookmark extends PixelT paintExpecter.blockUntilClear(PAINT_CLEAR_DELAY); // Clean up the bookmark we created deleteBookmark(); } private boolean waitForBookmarked(final boolean isBookmarked) { waitForTest(new BooleanTest() { + @Override public boolean test() { try { return isBookmarked == (Boolean)mIsBookmarked.invoke(null, getActivity().getContentResolver(), BOOKMARK_URL); } catch(java.lang.IllegalAccessException ex) { mAsserter.is(true, false, "Can not call addBookmark"); } catch(java.lang.reflect.InvocationTargetException ex) { mAsserter.is(true, false, "Error calling addBookmark"); }
--- a/mobile/android/base/tests/testBookmarklets.java.in +++ b/mobile/android/base/tests/testBookmarklets.java.in @@ -26,16 +26,17 @@ public class testBookmarklets extends Pi // load a standard page so bookmarklets work loadAndPaint(url); // verify that user-entered bookmarklets do *not* work enterUrl(js); mActions.sendSpecialKey(Actions.SpecialKey.ENTER); alerted = waitForTest(new BooleanTest() { + @Override public boolean test() { return mSolo.searchButton("OK", true) || mSolo.searchText("12.34", true); } }, 3000); mAsserter.is(alerted, false, "Alert was not shown for user-entered bookmarklet"); // add the bookmarklet to the database. there's currently no way to // add this using the UI, so we go through the content provider. @@ -60,16 +61,17 @@ public class testBookmarklets extends Pi } else { mAsserter.is(true, true, "Did not find the title '" + title + "' of the bookmark in the list"); } if (!found) { mAsserter.is(found, true, "Found the bookmark: " + js + " and clicked on it"); } alerted = waitForTest(new BooleanTest() { + @Override public boolean test() { return mSolo.searchButton("OK", true) && mSolo.searchText("12.34", true); } }, 3000); mAsserter.is(alerted, true, "Alert was shown for clicked bookmarklet"); // remove the bookmarklet deleteBookmark(js);
--- a/mobile/android/base/tests/testBookmarksTab.java.in +++ b/mobile/android/base/tests/testBookmarksTab.java.in @@ -97,16 +97,17 @@ public class testBookmarksTab extends Ba private void testContextMenu(String url) { list = getBookmarksList(); mSolo.waitForText(url); // wait for the bookmarks list to be populated View child; mFirstChild = null; boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { mFirstChild = list.getChildAt(1); if (mFirstChild == null) { return false; } if (mFirstChild instanceof android.view.ViewGroup) { ViewGroup group = (ViewGroup)mFirstChild; if (group.getChildCount() < 1) {
--- a/mobile/android/base/tests/testBrowserProvider.java.in +++ b/mobile/android/base/tests/testBrowserProvider.java.in @@ -372,16 +372,17 @@ public class testBrowserProvider extends setTestName(test.getClass().getSimpleName()); ensureEmptyDatabase(); test.run(); } } abstract class Test implements Runnable { + @Override public void run() { try { test(); } catch (Exception e) { mAsserter.is(true, false, "Test " + this.getClass().getName() + " threw exception: " + e); } }
--- a/mobile/android/base/tests/testHistory.java.in +++ b/mobile/android/base/tests/testHistory.java.in @@ -35,16 +35,17 @@ public class testHistory extends PixelTe final ListView hList = openHistoryList(); mAsserter.ok(hList != null, "checking history exists", "history exists"); // Click on the history item and wait for the page to load // wait for the history list to be populated mFirstChild = null; boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { mFirstChild = hList.getChildAt(1); if (mFirstChild == null) { return false; } if (mFirstChild instanceof android.view.ViewGroup) { ViewGroup group = (ViewGroup)mFirstChild; if (group.getChildCount() < 1) {
--- a/mobile/android/base/tests/testHistoryTab.java.in +++ b/mobile/android/base/tests/testHistoryTab.java.in @@ -161,16 +161,17 @@ public class testHistoryTab extends Pixe private void testContextMenu(String url) { listview = getHistoryList(); mSolo.waitForText(url); // wait for the history list to be populated mFirstChild = null; boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { mFirstChild = listview.getChildAt(1); if (mFirstChild == null) { return false; } if (mFirstChild instanceof android.view.ViewGroup) { ViewGroup group = (ViewGroup)mFirstChild; if (group.getChildCount() < 1) { @@ -218,16 +219,17 @@ public class testHistoryTab extends Pixe View child = listview.getChildAt(0); mSolo.clickOnView(child); // nothing should happen Actions.EventExpecter contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded"); mFirstChild = null; boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { mFirstChild = listview.getChildAt(1); if (mFirstChild == null) { return false; } return true; } }, MAX_WAIT_MS);
--- a/mobile/android/base/tests/testNewTab.java.in +++ b/mobile/android/base/tests/testNewTab.java.in @@ -61,16 +61,17 @@ public class testNewTab extends BaseTest // open tabs panel boolean clicked = tabs.click(); if (!clicked) { mAsserter.ok(clicked != false, "checking that tabs clicked", "tabs element clicked"); } // wait for closeTab to appear (this is usually immediate) boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { View closeTabView = getActivity().findViewById(closeTabId); if (closeTabView == null) { return false; } return true; } }, MAX_WAIT_MS); @@ -83,16 +84,17 @@ public class testNewTab extends BaseTest tabCountInt = Integer.parseInt(tabCountText); while (tabCountInt > 1) { clicked = closeTab.click(); if (!clicked) { mAsserter.ok(clicked != false, "checking that close_tab clicked", "close_tab element clicked"); } success = waitForTest(new BooleanTest() { + @Override public boolean test() { String newTabCountText = tabCount.getText(); int newTabCount = Integer.parseInt(newTabCountText); if (newTabCount < tabCountInt) { tabCountInt = newTabCount; return true; } return false;
--- a/mobile/android/base/tests/testSearchSuggestions.java.in +++ b/mobile/android/base/tests/testSearchSuggestions.java.in @@ -50,16 +50,17 @@ public class testSearchSuggestions exten enginesEventExpecter.blockForEvent(); connectSuggestClient(awesomeBarActivity); for (int i = 0; i < TEST_QUERY.length(); i++) { mActions.sendKeys(TEST_QUERY.substring(i, i+1)); final String query = TEST_QUERY.substring(0, i+1); boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { // get the first suggestion row ViewGroup suggestionGroup = (ViewGroup) awesomeBarActivity.findViewById(suggestionLayoutId); if (suggestionGroup == null) return false; ArrayList<String> expected = suggestMap.get(query); for (int i = 0; i < expected.size(); i++) { @@ -112,16 +113,17 @@ public class testSearchSuggestions exten final Class awesomeBarTabsClass = classLoader.loadClass("org.mozilla.gecko.AwesomeBarTabs"); final Method getAllPagesTabMethod = awesomeBarTabsClass.getMethod("getAllPagesTab"); final View awesomeBarTabs = (View) awesomeBarActivity.findViewById(awesomeBarTabsId); final Class allPagesTabClass = classLoader.loadClass("org.mozilla.gecko.AllPagesTab"); final Field suggestClientField = allPagesTabClass.getDeclaredField("mSuggestClient"); final Object allPagesTab = getAllPagesTabMethod.invoke(awesomeBarTabs); suggestClientField.setAccessible(true); waitForTest(new BooleanTest() { + @Override public boolean test() { // wait for mSuggestClient to be set before we replace it try { return suggestClientField.get(allPagesTab) != null; } catch (IllegalAccessException e) { return false; } }
--- a/mobile/android/base/tests/testShareLink.java.in +++ b/mobile/android/base/tests/testShareLink.java.in @@ -159,16 +159,17 @@ public class testShareLink extends BaseT return false; } private ListView getDisplayedShareList() { final ArrayList<ListView> views = mSolo.getCurrentListViews(); list = null; boolean success = waitForTest(new BooleanTest() { + @Override public boolean test() { for (ListView view : views) { list = view; return true; } return false; } }, MAX_WAIT_MS);
--- a/mobile/android/base/tests/testThumbnails.java.in +++ b/mobile/android/base/tests/testThumbnails.java.in @@ -96,16 +96,17 @@ public class testThumbnails extends Base private String mTitle; private int mColor; public ThumbnailTest(String title, int color) { mTitle = title; mColor = color; } + @Override public boolean test() { return getTopSiteThumbnailColor(mTitle) == mColor; } } private int getTopSiteThumbnailColor(String title) { ViewGroup topSites = (ViewGroup) getActivity().findViewById(mTopSitesId); if (topSites != null) {
--- a/mobile/android/base/widget/DateTimePicker.java +++ b/mobile/android/base/widget/DateTimePicker.java @@ -90,16 +90,17 @@ public class DateTimePicker extends Fram private Calendar mMinDate; private Calendar mMaxDate; private Calendar mCurrentDate; private PickersState mState; public static enum PickersState { DATE, MONTH, WEEK, TIME, DATETIME }; public class OnValueChangeListener implements NumberPicker.OnValueChangeListener { + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { updateInputState(); mTempDate.setTimeInMillis(mCurrentDate.getTimeInMillis()); boolean newBehavior = (Build.VERSION.SDK_INT > 10); if (newBehavior) { if (DEBUG) Log.d(LOGTAG, "Sdk version > 10, using new behavior"); //The native date picker widget on these sdks increment //the next field when one field reach the maximum @@ -197,16 +198,17 @@ public class DateTimePicker extends Fram private static final NumberPicker.Formatter TWO_DIGIT_FORMATTER = new NumberPicker.Formatter() { final StringBuilder mBuilder = new StringBuilder(); final java.util.Formatter mFmt = new java.util.Formatter(mBuilder, java.util.Locale.US); final Object[] mArgs = new Object[1]; + @Override public String format(int value) { mArgs[0] = value; mBuilder.delete(0, mBuilder.length()); mFmt.format("%02d", mArgs); return mFmt.toString(); } }; @@ -270,16 +272,17 @@ public class DateTimePicker extends Fram LayoutParams layoutParams = new LayoutParams(250,280); mCalendar.setLayoutParams(layoutParams); mCalendar.setFocusable(true); mCalendar.setFocusableInTouchMode(true); mCalendar.setMaxDate(mMaxDate.getTimeInMillis()); mCalendar.setMinDate(mMinDate.getTimeInMillis()); mCalendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { + @Override public void onSelectedDayChange( CalendarView view, int year, int month, int monthDay) { mTempDate.set(year, month, monthDay); setDate(mTempDate); notifyDateChanged(); } });