private boolean handleResolveInfo( ResolveInfo resolveInfo, String urlAsString, long urlLoadStartTime) { if (Settings.get().didRecentlyRedirectToApp(urlAsString)) { return false; } boolean isLinkBubble = resolveInfo.activityInfo != null && resolveInfo.activityInfo.packageName.equals(mAppPackageName); if (isLinkBubble == false && MainApplication.loadResolveInfoIntent(mContext, resolveInfo, urlAsString, -1)) { if (getActiveTabCount() == 0 && Prompt.isShowing() == false) { finish(); } String title = String.format( mContext.getString(R.string.link_loaded_with_app), resolveInfo.loadLabel(mContext.getPackageManager())); MainApplication.saveUrlInHistory(mContext, resolveInfo, urlAsString, title); Settings.get().addRedirectToApp(urlAsString); Settings.get() .trackLinkLoadTime( System.currentTimeMillis() - urlLoadStartTime, Settings.LinkLoadType.AppRedirectInstant, urlAsString); return true; } return false; }
private void showClosePrompt(final TabView tabView) { String title = null; if (tabView.getUrl() != null && MainApplication.sTitleHashMap != null) { String urlAsString = tabView.getUrl().toString(); title = MainApplication.sTitleHashMap.get(urlAsString); } String message; if (title != null) { message = String.format(mContext.getResources().getString(R.string.undo_close_tab_title), title); } else { message = mContext.getResources().getString(R.string.undo_close_tab_no_title); } tabView.mWasRestored = false; Prompt.show( message, mContext.getResources().getString(R.string.action_undo).toUpperCase(), Prompt.LENGTH_SHORT, true, new Prompt.OnPromptEventListener() { @Override public void onActionClick() { if (tabView.mWasRestored == false) { tabView.mIsClosing = false; restoreTab(tabView); tabView.getContentView().onRestored(); } } @Override public void onClose() { if (tabView.mWasRestored == false) { tabView.destroy(); } } }); }
public TabView openUrl( final String urlAsString, long urlLoadStartTime, final boolean setAsCurrentTab, String openedFromAppName) { Analytics.trackOpenUrl(openedFromAppName); if (wasUrlRecentlyLoaded(urlAsString, urlLoadStartTime) && !urlAsString.equals(mContext.getString(R.string.empty_bubble_page))) { Toast.makeText(mContext, R.string.duplicate_link_will_not_be_loaded, Toast.LENGTH_SHORT) .show(); return null; } URL url; try { url = new URL(urlAsString); } catch (MalformedURLException e) { // If this is not a valid scheme, back out. #271 Toast.makeText(mContext, mContext.getString(R.string.unsupported_scheme), Toast.LENGTH_SHORT) .show(); if (getActiveTabCount() == 0 && Prompt.isShowing() == false) { finish(); } return null; } if (Settings.get().redirectUrlToBrowser(url)) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(urlAsString)); intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); if (MainApplication.openInBrowser(mContext, intent, false)) { if (getActiveTabCount() == 0 && Prompt.isShowing() == false) { finish(); } String title = String.format( mContext.getString(R.string.link_redirected), Settings.get().getDefaultBrowserLabel()); MainApplication.saveUrlInHistory(mContext, null, urlAsString, title); return null; } } boolean showAppPicker = false; PackageManager packageManager = mContext.getPackageManager(); final List<ResolveInfo> resolveInfos = Settings.get().getAppsThatHandleUrl(url.toString(), packageManager); ResolveInfo defaultAppResolveInfo = Settings.get().getDefaultAppForUrl(url, resolveInfos); if (resolveInfos != null && resolveInfos.size() > 0) { if (defaultAppResolveInfo != null) { if (handleResolveInfo(defaultAppResolveInfo, urlAsString, urlLoadStartTime)) { return null; } } else if (resolveInfos.size() == 1) { if (handleResolveInfo(resolveInfos.get(0), urlAsString, urlLoadStartTime)) { return null; } } else { // If LinkBubble is a valid resolve target, do not show other options to open the content. for (ResolveInfo info : resolveInfos) { if (info.activityInfo.packageName.startsWith("com.linkbubble.playstore")) { showAppPicker = false; break; } else { showAppPicker = true; } } } } boolean openedFromItself = false; if (null != openedFromAppName && (openedFromAppName.equals(Analytics.OPENED_URL_FROM_NEW_TAB) || openedFromAppName.equals(Analytics.OPENED_URL_FROM_HISTORY))) { showAppPicker = true; openedFromItself = true; } mCanAutoDisplayLink = true; final TabView result = openUrlInTab(urlAsString, urlLoadStartTime, setAsCurrentTab, showAppPicker); // Show app picker after creating the tab to load so that we have the instance to close if // redirecting to an app, re #292. if (!openedFromItself && showAppPicker && MainApplication.sShowingAppPickerDialog == false && 0 != resolveInfos.size()) { AlertDialog dialog = ActionItem.getActionItemPickerAlert( mContext, resolveInfos, R.string.pick_default_app, new ActionItem.OnActionItemDefaultSelectedListener() { @Override public void onSelected(ActionItem actionItem, boolean always) { boolean loaded = false; for (ResolveInfo resolveInfo : resolveInfos) { if (resolveInfo.activityInfo.packageName.equals(actionItem.mPackageName) && resolveInfo.activityInfo.name.equals(actionItem.mActivityClassName)) { if (always) { Settings.get().setDefaultApp(urlAsString, resolveInfo); } // Jump out of the loop and load directly via a BubbleView below if (resolveInfo.activityInfo.packageName.equals(mAppPackageName)) { break; } loaded = MainApplication.loadIntent( mContext, actionItem.mPackageName, actionItem.mActivityClassName, urlAsString, -1, true); break; } } if (loaded) { Settings.get().addRedirectToApp(urlAsString); closeTab(result, contentViewShowing(), false); if (getActiveTabCount() == 0 && Prompt.isShowing() == false) { finish(); } // L_WATCH: L currently lacks getRecentTasks(), so minimize here if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { MainController.get().switchToBubbleView(); } } } }); dialog.setOnDismissListener( new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { MainApplication.sShowingAppPickerDialog = false; } }); dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); Util.showThemedDialog(dialog); MainApplication.sShowingAppPickerDialog = true; } return result; }
public void doFrame(long frameTimeNanos) { mUpdateScheduled = false; // if (mHiddenByUser == true) { // return; // } float t0 = mPreviousFrameTime / 1000000000.0f; float t1 = frameTimeNanos / 1000000000.0f; float t = t1 - t0; mPreviousFrameTime = frameTimeNanos; float dt; if (Constant.DYNAMIC_ANIM_STEP) { dt = Util.clamp(0.0f, t, 3.0f / 60.0f); } else { dt = 1.0f / 60.0f; } if (mBubbleFlowDraggable.update()) { scheduleUpdate(); } mBubbleDraggable.update(dt); mCanvasView.update(dt); if (getActiveTabCount() == 0 && mBubblesLoaded > 0 && !mUpdateScheduled) { // Will be non-zero in the event a link has been dismissed by a user, but its TabView // instance is still animating off screen. In that case, keep triggering an update so that // when the // item finishes, we are ready to call onDestroy(). if (mBubbleFlowDraggable.getVisibleTabCount() == 0 && Prompt.isShowing() == false) { finish(); } else { scheduleUpdate(); } } if (mHiddenByUser == false) { updateKeyguardLocked(); } if (Constant.PROFILE_FPS) { if (t < MAX_VALID_TIME) { mSamples[mSampleCount % MAX_SAMPLE_COUNT] = t; ++mSampleCount; } float total = 0.0f; float worst = 0.0f; float best = 99999999.0f; int badFrames = 0; int frameCount = Math.min(mSampleCount, MAX_SAMPLE_COUNT); for (int i = 0; i < frameCount; ++i) { total += mSamples[i]; worst = Math.max(worst, mSamples[i]); best = Math.min(best, mSamples[i]); if (mSamples[i] > 1.5f / 60.0f) { ++badFrames; } } String sbest = String.format("%.2f", 1000.0f * best); String sworst = String.format("%.2f", 1000.0f * worst); String savg = String.format("%.2f", 1000.0f * total / frameCount); String badpc = String.format("%.2f", 100.0f * badFrames / frameCount); String s = "Best=" + sbest + "\nWorst=" + sworst + "\nAvg=" + savg + "\nBad=" + badFrames + "\nBad %=" + badpc + "%"; mTextView.setSingleLine(false); mTextView.setText(s); scheduleUpdate(); } }