0

[WebEngine] Add Views for switching between Tabs

Change-Id: Ie2e431029107c81d112863ea7bcf1da4cb6c04aa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4270573
Commit-Queue: Parsa Mesgarha <parsam@chromium.org>
Reviewed-by: Rayan Kanso <rayankans@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1107461}
This commit is contained in:
Parsa Mesgarha
2023-02-20 15:18:36 +00:00
committed by Chromium LUCI CQ
parent 55f290dfb1
commit 62f458ad6d
5 changed files with 130 additions and 8 deletions
weblayer/shell/android/webengine_shell_apk

@ -18,12 +18,30 @@ found in the LICENSE file.
android:text="x.x.x"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/url_bar"
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textUri"
android:selectAllOnFocus="true" />
android:weightSum="6">
<EditText
android:id="@+id/url_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:inputType="textUri"
android:selectAllOnFocus="true" />
<Button
android:id="@+id/tab_count"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Spinner
android:id="@+id/tab_list"
android:layout_width="0dp"
android:layout_height="0dp"
android:spinnerMode="dialog"
android:visibility="invisible" />
</LinearLayout>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
@ -32,7 +50,6 @@ found in the LICENSE file.
style="@android:style/Widget.ProgressBar.Horizontal"
android:progressBackgroundTint="#0fff"
android:progressTint="#4285F4" />
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"

@ -11,6 +11,7 @@ import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Spinner;
@ -131,7 +132,11 @@ public class WebEngineShellActivity extends AppCompatActivity {
Tab activeTab = mTabManager.getActiveTab();
ProgressBar progressBar = findViewById(R.id.progress_bar);
EditText urlBar = findViewById(R.id.url_bar);
new TopBarObservers(new TopBarImpl(this, mTabManager, urlBar, progressBar), mTabManager);
Button tabCountButton = findViewById(R.id.tab_count);
Spinner tabListSpinner = findViewById(R.id.tab_list);
new TopBarObservers(new TopBarImpl(this, mTabManager, urlBar, progressBar, tabCountButton,
tabListSpinner),
mTabManager);
mTabManager.registerTabListObserver(new DefaultObservers.DefaultTabListObserver());
activeTab.getNavigationController().registerNavigationObserver(

@ -14,5 +14,13 @@ public abstract class TopBar {
public abstract void setProgress(double progress);
public abstract void addTabToList(Tab tab);
public abstract void removeTabFromList(Tab tab);
public abstract void setTabListSelection(Tab tab);
public abstract boolean isTabActive(Tab tab);
public abstract int getTabsCount();
}

@ -10,10 +10,16 @@ import android.util.Patterns;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.annotation.NonNull;
import org.chromium.webengine.Tab;
import org.chromium.webengine.TabManager;
@ -25,14 +31,28 @@ public class TopBarImpl extends TopBar {
private final TabManager mTabManager;
private final EditText mUrlBar;
private final ProgressBar mProgressBar;
private final Button mTabCountButton;
private final Spinner mTabListSpinner;
private final ArrayAdapter<TabWrapper> mTabListAdapter;
public TopBarImpl(
Context context, TabManager tabManager, EditText urlBar, ProgressBar progressBar) {
public TopBarImpl(Context context, TabManager tabManager, EditText urlBar,
ProgressBar progressBar, Button tabCountButton, Spinner tabListSpinner) {
mContext = context;
mTabManager = tabManager;
mUrlBar = urlBar;
mProgressBar = progressBar;
mTabCountButton = tabCountButton;
mTabCountButton.setText(String.valueOf(getTabsCount()));
mTabListAdapter = new ArrayAdapter<TabWrapper>(
context, android.R.layout.simple_spinner_dropdown_item);
for (Tab t : mTabManager.getAllTabs()) {
mTabListAdapter.add(new TabWrapper(t));
}
mTabListSpinner = tabListSpinner;
mTabListSpinner.setAdapter(mTabListAdapter);
urlBar.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
@ -55,6 +75,17 @@ public class TopBarImpl extends TopBar {
return true;
}
});
mTabCountButton.setOnClickListener(v -> mTabListSpinner.performClick());
mTabListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
mTabListAdapter.getItem(pos).getTab().setActive();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
}
@Override
@ -73,8 +104,59 @@ public class TopBarImpl extends TopBar {
mProgressBar.setProgress(progressValue);
}
@Override
public void addTabToList(Tab tab) {
mTabCountButton.setText(String.valueOf(getTabsCount()));
mTabListAdapter.add(new TabWrapper(tab));
}
@Override
public void removeTabFromList(Tab tab) {
mTabCountButton.setText(String.valueOf(getTabsCount()));
for (int position = 0; position < mTabListAdapter.getCount(); ++position) {
TabWrapper tabAdapter = mTabListAdapter.getItem(position);
if (tabAdapter.getTab().equals(tab)) {
mTabListAdapter.remove(tabAdapter);
return;
}
}
}
@Override
public void setTabListSelection(Tab tab) {
for (int position = 0; position < mTabListAdapter.getCount(); ++position) {
TabWrapper tabWrapper = mTabListAdapter.getItem(position);
if (tabWrapper.getTab().equals(tab)) {
mTabListSpinner.setSelection(mTabListAdapter.getPosition(tabWrapper));
return;
}
}
}
@Override
public boolean isTabActive(Tab tab) {
return mTabManager.getActiveTab() != null && mTabManager.getActiveTab().equals(tab);
}
@Override
public int getTabsCount() {
return mTabManager.getAllTabs().size();
}
static class TabWrapper {
final Tab mTab;
public TabWrapper(Tab tab) {
mTab = tab;
}
public Tab getTab() {
return mTab;
}
@NonNull
@Override
public String toString() {
return mTab.getDisplayUri().getAuthority() + mTab.getDisplayUri().getPath();
}
}
}

@ -62,15 +62,25 @@ public class TopBarObservers {
class TopBarTabListObserver extends TabListObserver {
@Override
public void onActiveTabChanged(@Nullable Tab activeTab) {
if (activeTab == null) {
return;
}
mTopBar.setUrlBar(activeTab.getDisplayUri().toString());
mTopBar.setTabListSelection(activeTab);
}
@Override
public void onTabAdded(@NonNull Tab tab) {
mTopBar.addTabToList(tab);
// Recursively add tab and navigation observers to any new tab.
tab.registerTabObserver(new TopBarTabObserver(tab));
tab.getNavigationController().registerNavigationObserver(
new TopBarNavigationObserver(tab));
}
@Override
public void onTabRemoved(@NonNull Tab tab) {
mTopBar.removeTabFromList(tab);
}
}
}