Esempio n. 1
0
  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;
  }
Esempio n. 2
0
  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();
            }
          }
        });
  }
Esempio n. 3
0
  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;
  }
Esempio n. 4
0
  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();
    }
  }