[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:

committed by
Chromium LUCI CQ

parent
55f290dfb1
commit
62f458ad6d
weblayer/shell/android/webengine_shell_apk
res
layout
src
org
chromium
webengine
@ -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();
|
||||
}
|
||||
|
86
weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java
86
weblayer/shell/android/webengine_shell_apk/src/org/chromium/webengine/shell/topbar/TopBarImpl.java
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user