diff --git a/briar-android/artwork/transports_list_scene.xml b/briar-android/artwork/transports_list_scene.xml new file mode 100644 index 000000000..bcb0d82ea --- /dev/null +++ b/briar-android/artwork/transports_list_scene.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java index 3c63d1c4e..e80aec526 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerActivity.java @@ -1,17 +1,15 @@ package org.briarproject.briar.android.navdrawer; -import android.annotation.SuppressLint; import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.GridView; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.ImageView; +import android.widget.ScrollView; import android.widget.TextView; import com.google.android.material.navigation.NavigationView; @@ -21,10 +19,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; -import org.briarproject.bramble.api.plugin.BluetoothConstants; -import org.briarproject.bramble.api.plugin.LanTcpConstants; import org.briarproject.bramble.api.plugin.Plugin.State; -import org.briarproject.bramble.api.plugin.TorConstants; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; @@ -39,25 +34,22 @@ import org.briarproject.briar.android.logout.SignOutFragment; import org.briarproject.briar.android.privategroup.list.GroupListFragment; import org.briarproject.briar.android.settings.SettingsActivity; -import java.util.ArrayList; -import java.util.List; import java.util.logging.Logger; import javax.inject.Inject; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.UiThread; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import static android.view.View.GONE; +import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static androidx.core.view.GravityCompat.START; import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_CLOSED; @@ -65,8 +57,6 @@ import static androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE; import static java.util.Objects.requireNonNull; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.api.lifecycle.LifecycleManager.LifecycleState.RUNNING; -import static org.briarproject.bramble.api.plugin.Plugin.State.ACTIVE; -import static org.briarproject.bramble.api.plugin.Plugin.State.ENABLING; import static org.briarproject.briar.android.BriarService.EXTRA_STARTUP_FAILED; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PASSWORD; import static org.briarproject.briar.android.navdrawer.IntentRouter.handleExternalIntent; @@ -102,11 +92,9 @@ public class NavDrawerActivity extends BriarActivity implements LifecycleManager lifecycleManager; private DrawerLayout drawerLayout; + private ScrollView drawerScrollView; private NavigationView navigation; - private List transports; - private BaseAdapter transportsAdapter; - @Override public void injectActivity(ActivityComponent component) { component.inject(this); @@ -118,10 +106,26 @@ public class NavDrawerActivity extends BriarActivity implements exitIfStartupFailed(getIntent()); setContentView(R.layout.activity_nav_drawer); + drawerScrollView = findViewById(R.id.drawerScrollView); + drawerScrollView.getViewTreeObserver().addOnGlobalLayoutListener( + new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + // hide/show chevron depending on whether we can scroll + View chevronView = findViewById(R.id.chevronView); + if (drawerScrollView.canScrollVertically(1)) { + chevronView.setVisibility(VISIBLE); + } else { + chevronView.setVisibility(INVISIBLE); + } + drawerScrollView.getViewTreeObserver() + .removeOnGlobalLayoutListener(this); + } + }); + Toolbar toolbar = findViewById(R.id.toolbar); drawerLayout = findViewById(R.id.drawer_layout); navigation = findViewById(R.id.navigation); - GridView transportsView = findViewById(R.id.transportsView); setSupportActionBar(toolbar); ActionBar actionBar = requireNonNull(getSupportActionBar()); @@ -134,9 +138,6 @@ public class NavDrawerActivity extends BriarActivity implements drawerLayout.addDrawerListener(drawerToggle); navigation.setNavigationItemSelectedListener(this); - initializeTransports(getLayoutInflater()); - transportsView.setAdapter(transportsAdapter); - lockManager.isLockable().observe(this, this::setLockVisible); if (lifecycleManager.getLifecycleState().isAfter(RUNNING)) { @@ -152,10 +153,8 @@ public class NavDrawerActivity extends BriarActivity implements } @Override - @SuppressLint("NewApi") public void onStart() { super.onStart(); - updateTransports(); lockManager.checkIfLockable(); controller.showExpiryWarning(new UiResultHandler(this) { @Override @@ -373,109 +372,9 @@ public class NavDrawerActivity extends BriarActivity implements expiryWarning.setVisibility(VISIBLE); } - private void initializeTransports(LayoutInflater inflater) { - transports = new ArrayList<>(3); - - Transport tor = new Transport(); - tor.id = TorConstants.ID; - tor.state = controller.getTransportState(tor.id); - tor.iconId = R.drawable.transport_tor; - tor.textId = R.string.transport_tor; - transports.add(tor); - - Transport bt = new Transport(); - bt.id = BluetoothConstants.ID; - bt.state = controller.getTransportState(bt.id); - bt.iconId = R.drawable.transport_bt; - bt.textId = R.string.transport_bt; - transports.add(bt); - - Transport lan = new Transport(); - lan.id = LanTcpConstants.ID; - lan.state = controller.getTransportState(lan.id); - lan.iconId = R.drawable.transport_lan; - lan.textId = R.string.transport_lan; - transports.add(lan); - - transportsAdapter = new BaseAdapter() { - @Override - public int getCount() { - return transports.size(); - } - - @Override - public Transport getItem(int position) { - return transports.get(position); - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public View getView(int position, View convertView, - ViewGroup parent) { - View view; - if (convertView != null) { - view = convertView; - } else { - view = inflater.inflate(R.layout.list_item_transport, - parent, false); - } - - Transport t = getItem(position); - int c; - if (t.state == ACTIVE) { - c = ContextCompat.getColor(NavDrawerActivity.this, - R.color.briar_green_light); - } else if (t.state == ENABLING) { - c = ContextCompat.getColor(NavDrawerActivity.this, - R.color.briar_yellow); - } else { - c = ContextCompat.getColor(NavDrawerActivity.this, - android.R.color.tertiary_text_light); - } - - ImageView icon = view.findViewById(R.id.imageView); - icon.setImageDrawable(ContextCompat - .getDrawable(NavDrawerActivity.this, t.iconId)); - icon.setColorFilter(c); - - TextView text = view.findViewById(R.id.textView); - text.setText(getString(t.textId)); - - return view; - } - }; - } - - private void updateTransports() { - if (transports == null || transportsAdapter == null) return; - for (Transport t : transports) { - t.state = controller.getTransportState(t.id); - } - transportsAdapter.notifyDataSetChanged(); - } - @Override public void stateUpdate(TransportId id, State state) { - if (transports == null || transportsAdapter == null) return; - for (Transport t : transports) { - if (t.id.equals(id)) { - t.state = state; - transportsAdapter.notifyDataSetChanged(); - break; - } - } + // TODO } - @UiThread - private static class Transport { - - private TransportId id; - private State state; - private int iconId; - private int textId; - } } diff --git a/briar-android/src/main/res/drawable/ic_baseline_drag_handle.xml b/briar-android/src/main/res/drawable/ic_baseline_drag_handle.xml new file mode 100644 index 000000000..de7bbda0a --- /dev/null +++ b/briar-android/src/main/res/drawable/ic_baseline_drag_handle.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/briar-android/src/main/res/layout/navigation_menu.xml b/briar-android/src/main/res/layout/navigation_menu.xml index 4a7a32c4f..482b362b5 100644 --- a/briar-android/src/main/res/layout/navigation_menu.xml +++ b/briar-android/src/main/res/layout/navigation_menu.xml @@ -1,7 +1,7 @@ - - - - + app:layout_constraintTop_toBottomOf="@+id/navigation" /> diff --git a/briar-android/src/main/res/layout/transports_list.xml b/briar-android/src/main/res/layout/transports_list.xml index a484522c7..43cbd1e87 100644 --- a/briar-android/src/main/res/layout/transports_list.xml +++ b/briar-android/src/main/res/layout/transports_list.xml @@ -1,19 +1,162 @@ - - + - + + + android:layout_marginBottom="8dp" + android:text="@string/transport_internet" + android:textSize="12sp" + app:layout_constraintBottom_toTopOf="@+id/torSwitch" + app:layout_constraintStart_toStartOf="@+id/torIcon" /> - + + + + + + + + + + + + + + + + + diff --git a/briar-android/src/main/res/menu/navigation_drawer.xml b/briar-android/src/main/res/menu/navigation_drawer.xml index 6f3606d0f..c24131755 100644 --- a/briar-android/src/main/res/menu/navigation_drawer.xml +++ b/briar-android/src/main/res/menu/navigation_drawer.xml @@ -1,6 +1,6 @@ - + + android:visible="false" + tools:visible="false" /> Sign Out - Internet + Connections + Internet + Tor + Nearby Bluetooth Wi-Fi