diff --git a/app/build.gradle b/app/build.gradle index ab27eff0253103e8975bdc150ed7e9904b14a297..7417cde86e19b5629d6d8b3ff1345827f6998629 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -148,7 +148,7 @@ dependencies { // UI Libs compile(name:'library-release', ext:'aar') - compile('com.mikepenz:materialdrawer:5.0.0.b25-SNAPSHOT@aar') { transitive = true } + compile('com.mikepenz:materialdrawer:5.0.0.b27-SNAPSHOT@aar') { transitive = true } compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') { transitive = true } compile('com.github.afollestad.material-dialogs:commons:0.8.5.3@aar') { transitive = true } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d6b9d66cc46b3f135d792a1a422712dcf38a3c04..706f21623d293ed654e4e5fd55917af2d668c6d0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,24 +51,28 @@ android:name=".ui.chat.MainActivity" android:label="@string/appName" android:launchMode="singleTask" + android:parentActivityName=".ui.LoginActivity" android:theme="@style/AppTheme.Light" /> <activity android:name=".ui.chat.ChannelDetailActivity" - android:label="Channel Detail" + android:label="Channel Details" android:launchMode="singleTask" - android:theme="@style/SetupTheme" /> + android:parentActivityName=".ui.chat.MainActivity" + android:theme="@style/AppTheme.Light" /> <activity android:name=".ui.setup.AccountSetupActivity" android:label="Setup a new Account" android:launchMode="singleTask" + android:parentActivityName=".ui.setup.AccountSelectActivity" android:theme="@style/SetupTheme" /> <activity android:name=".ui.setup.AccountSelectActivity" android:label="Select an Account" android:launchMode="singleTask" + android:parentActivityName=".ui.LoginActivity" android:theme="@style/SetupTheme" /> </application> diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java index a7a4ea461ceba5d7ee895c701da4f7f141c50bbc..7e4042db56d821dee8b7b1e6adef8d00d9d5a8b4 100644 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java @@ -31,7 +31,9 @@ import java.util.List; import java.util.Map; import java.util.Set; +import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.events.BacklogInitEvent; +import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.localtypes.buffers.Buffer; import de.kuschku.libquassel.localtypes.buffers.Buffers; import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; @@ -163,6 +165,9 @@ public class BufferManager { } public void doBacklogInit(int amount) { + BusProvider provider = client.provider(); + assertNotNull(provider); + Set<Integer> visibleBuffers = new HashSet<>(); for (QBufferViewConfig bufferConfig : client.bufferViewManager().bufferViewConfigs()) { visibleBuffers.addAll(bufferConfig.bufferIds()); @@ -175,6 +180,11 @@ public class BufferManager { int waitingMax = client.backlogManager().waitingMax(); int waitingCurrently = client.backlogManager().waiting().size(); - client.provider().sendEvent(new BacklogInitEvent(waitingMax - waitingCurrently, waitingMax)); + provider.sendEvent(new BacklogInitEvent(waitingMax - waitingCurrently, waitingMax)); + + if (waitingMax == 0) { + // TODO: Send event to set up chat list + client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); + } } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java index aa1c11002ab78995a0e2499f52706a1af38e98db..c6a994a3c6f9496bbedc326942054603f7bc8231 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java @@ -23,6 +23,7 @@ package de.kuschku.libquassel.syncables.types.impl; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import com.google.common.base.Joiner; @@ -59,13 +60,13 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { private String codecForEncoding; private String codecForDecoding; @NonNull - private Map<Character, List<String>> A_channelModes = new HashMap<>(); + public Map<Character, List<String>> A_channelModes = new HashMap<>(); @NonNull - private Map<Character, String> B_channelModes = new HashMap<>(); + public Map<Character, String> B_channelModes = new HashMap<>(); @NonNull - private Map<Character, String> C_channelModes = new HashMap<>(); + public Map<Character, String> C_channelModes = new HashMap<>(); @NonNull - private Set<Character> D_channelModes = new HashSet<>(); + public Set<Character> D_channelModes = new HashSet<>(); // Because we don’t have networks at the beginning yet @Nullable private Map<String, String> cachedUserModes; @@ -439,14 +440,21 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { } } if (cachedChanModes != null) { - if (cachedChanModes.get("A") != null) - A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A"); + if (cachedChanModes.get("A") != null) { + for (Map.Entry<String, QVariant<List<String>>> entry : ((Map<String, QVariant<List<String>>>) cachedChanModes.get("A")).entrySet()) { + A_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); + } + } if (cachedChanModes.get("B") != null) - B_channelModes = (Map<Character, String>) cachedChanModes.get("B"); + for (Map.Entry<String, QVariant<String>> entry : ((Map<String, QVariant<String>>) cachedChanModes.get("B")).entrySet()) { + B_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); + } if (cachedChanModes.get("C") != null) - C_channelModes = (Map<Character, String>) cachedChanModes.get("C"); + for (Map.Entry<String, QVariant<String>> entry : ((Map<String, QVariant<String>>) cachedChanModes.get("C")).entrySet()) { + C_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); + } if (cachedChanModes.get("D") != null) D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D")); @@ -507,4 +515,13 @@ public class IrcChannel extends AIrcChannel<IrcChannel> { users.add(newNick); userModes.put(newNick, userModes.get(oldNick)); } + + @Override + public List<Character> modeList() { + List<Character> modes = new ArrayList<>(); + modes.addAll(D_channelModes); + modes.addAll(C_channelModes.keySet()); + modes.addAll(B_channelModes.keySet()); + return modes; + } } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java index c5b6055f46f350b7a0950c71a6169603cabed94e..04844b485ae9a18aafc8218e6d1ab3a8e83158d0 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java @@ -92,7 +92,7 @@ public class Network extends ANetwork<Network> implements Observer { } public Network(Map<String, QIrcChannel> channels, Map<String, QIrcUser> nicks, List<NetworkServer> serverList, Map<String, String> supports, ConnectionState connectionState, String currentServer, boolean isConnected, int latency, String myNick, NetworkInfo networkInfo) { - this.channels = channels; + this.channels = new HashMap<>(channels); this.nicks = new HashMap<>(nicks); this.supports = supports; this.connectionState = connectionState; diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java index 66db4de0df5d8373df8175eb35c0e876b34ee37e..e4129a152f2a666f65296d72127f212dea735d3c 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java @@ -25,6 +25,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import java.util.List; +import java.util.Set; import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.syncables.Synced; @@ -156,4 +157,6 @@ public interface QIrcChannel extends QObservable { ObservableSet<String> users(); void _ircUserNickChanged(String oldNick, String newNick); + + List<Character> modeList(); } diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java index 84a36d0002e66d552612562b2a0ca95f4ba5f052..a1e8884f13b6b1526b38d40a2c134a665bab58a6 100644 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java +++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java @@ -385,11 +385,11 @@ public interface QNetwork extends QObservable { } enum ChannelModeType { - NOT_A_CHANMODE(0), - A_CHANMODE(1), - B_CHANMODE(2), - C_CHANMODE(3), - D_CHANMODE(4); + NOT_A_CHANMODE(-1), + A_CHANMODE(0), + B_CHANMODE(1), + C_CHANMODE(2), + D_CHANMODE(3); public final int id; @@ -400,16 +400,16 @@ public interface QNetwork extends QObservable { @NonNull public static ChannelModeType of(int id) { switch (id) { - case 1: + case 0: return A_CHANMODE; - case 2: + case 1: return B_CHANMODE; - case 3: + case 2: return C_CHANMODE; - case 4: + case 3: return D_CHANMODE; default: - case 0: + case -1: return NOT_A_CHANMODE; } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java index 370b97f21b73ae31c1ab567d4ec0b5e97fb233d7..01c7d2e16da7e15ec4e363169c22f0bbf9a48153 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java @@ -23,19 +23,14 @@ package de.kuschku.quasseldroid_ng.ui.chat; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.AppCompatButton; import android.support.v7.widget.Toolbar; import android.text.method.LinkMovementMethod; import android.util.Log; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import android.widget.Toast; import butterknife.Bind; import butterknife.ButterKnife; @@ -52,13 +47,16 @@ import de.kuschku.util.servicebound.BoundActivity; public class ChannelDetailActivity extends BoundActivity { @Bind(R.id.topic) TextView topic; - @Bind(R.id.mode) - TextView mode; + @Bind(R.id.modes) LinearLayout modes; + + @Bind(R.id.edit_topic) + AppCompatButton edit_topic; + @Bind(R.id.toolbar) Toolbar toolbar; - ModeAdapter modeAdapter; + private int buffer; @Override @@ -74,87 +72,64 @@ public class ChannelDetailActivity extends BoundActivity { super.onConnectToThread(thread); ChannelBuffer buffer = (ChannelBuffer) context.client().bufferManager().buffer(this.buffer); + if (buffer == null) return; + QIrcChannel channel = buffer.getChannel(); - String modeString = channel.channelModeString(); + if (channel == null) return; + if (channel.topic() != null) topic.setText(new IrcFormatHelper(context).formatIrcMessage(context.client(), channel.topic(), buffer.getInfo(), v -> finish())); topic.setMovementMethod(LinkMovementMethod.getInstance()); - mode.setText(String.format("Channel Mode %s", modeString)); - - if (getResources().getBoolean(R.bool.isTablet)) { - findViewById(R.id.appBar).setPadding(0, 0, 0, 0); - } else { - findViewById(R.id.appBar).setPadding(0, (int) getResources().getDimension(R.dimen.materialize_statusbar), 0, 0); - } toolbar.setTitle(channel.name()); setSupportActionBar(toolbar); modes.removeAllViews(); IrcModeProvider provider = channel.network().modeProvider(); - for (char c : modeString.toCharArray()) { + + String myModes = channel.userModes(channel.network().me()); + boolean isOp = false; + for (String c : channel.network().prefixModes()) { + if (!c.equalsIgnoreCase("v") && myModes.contains(c)) { + isOp = true; + break; + } + } + + boolean topicEditable = true; + for (char c : channel.modeList()) { ChanMode mode = provider.modeFromChar(c); if (mode != null) { View v = getLayoutInflater().inflate(R.layout.widget_channel_mode, modes, false); TextView name = (TextView) v.findViewById(R.id.name); TextView description = (TextView) v.findViewById(R.id.description); + TextView value = (TextView) v.findViewById(R.id.value); String modeName = context.themeUtil().translations.chanModeToName(mode); name.setText(String.format("%s (+%s)", modeName, c)); + String modeDescription = context.themeUtil().translations.chanModeToDescription(mode); description.setText(modeDescription); - modes.addView(v); - } - } - } - public void onEventMainThread(GeneralErrorEvent event) { - Log.e("DEBUG", String.valueOf(event)); - } + String modeValue = channel.modeValue(c); - public class ModeAdapter extends RecyclerView.Adapter<ChannelDetailActivity.ModeViewHolder> { - private List<ChanMode> channelModes = new ArrayList<>(); + if (modeValue != null && !modeValue.isEmpty()) { + value.setText(modeValue); + value.setVisibility(View.VISIBLE); + } - public void setModes(Collection<ChanMode> chanModes) { - channelModes.clear(); - channelModes.addAll(chanModes); - Log.e("DEBUG", String.valueOf(channelModes)); - notifyDataSetChanged(); - } + modes.addView(v); - @Override - public ChannelDetailActivity.ModeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - return new ModeViewHolder(inflater.inflate(R.layout.widget_channel_mode, parent, false)); + if (mode == ChanMode.RESTRICT_TOPIC) topicEditable = isOp; + } } - @Override - public void onBindViewHolder(ChannelDetailActivity.ModeViewHolder holder, int position) { - holder.bind(channelModes.get(position)); - } + edit_topic.setVisibility(topicEditable ? View.VISIBLE : View.GONE); - @Override - public int getItemCount() { - return channelModes.size(); - } + getSupportActionBar().setDisplayHomeAsUpEnabled(true); } - public class ModeViewHolder extends RecyclerView.ViewHolder { - - @Bind(R.id.name) - TextView name; - - @Bind(R.id.description) - TextView description; - - public ModeViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - } - - public void bind(ChanMode mode) { - name.setText(context.themeUtil().translations.chanModeToName(mode)); - description.setText(context.themeUtil().translations.chanModeToDescription(mode)); - } + public void onEventMainThread(GeneralErrorEvent event) { + Log.e("DEBUG", String.valueOf(event)); } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java index 8362f4b520609d20daca1b022de7d7f88b07061f..ba724a1def847de64ef4b9cbe38a88f8d9c3da8a 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigItem.java @@ -110,7 +110,7 @@ public class BufferViewConfigItem implements DrawerItemCallback { for (NetworkItem item : networks) { if (ids.contains(item.getNetwork().networkId())) { int position = networks.indexOf(item); - drawer.addItemAtPosition(item, position); + drawer.getItemAdapter().add(position, item); } } for (int i = 0; i < drawer.getAdapter().getItemCount(); i++) { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java index cb41cd1046561a35dbff2547d0c2721aaef27114..c847f05c617b0415534227ab6dfe9814d94ab719 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java @@ -384,6 +384,12 @@ public class ThemeUtil { @AutoString(R.string.chanMode_ONLY_ADMIN_DESCRIPTION) public String chanMode_ONLY_ADMIN_DESCRIPTION; + @AutoString(R.string.chanMode_FORWARD_NAME) + public String chanMode_FORWARD_NAME; + + @AutoString(R.string.chanMode_FORWARD_DESCRIPTION) + public String chanMode_FORWARD_DESCRIPTION; + @NonNull public CharSequence formatUsername(@NonNull CharSequence nick, @NonNull CharSequence hostmask) { @@ -547,7 +553,7 @@ public class ThemeUtil { case IS_SECURE: return chanMode_IS_SECURE_DESCRIPTION; case FORWARD: - break; + return chanMode_FORWARD_DESCRIPTION; } return null; } @@ -631,7 +637,7 @@ public class ThemeUtil { case IS_SECURE: return chanMode_IS_SECURE_NAME; case FORWARD: - break; + return chanMode_FORWARD_NAME; } return null; } diff --git a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java index 185216fafebbb6cfae951fd302e3db93cdfb1bbe..c7fefd73ae2849df748641d338d6f890ee813676 100644 --- a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java +++ b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java @@ -58,7 +58,7 @@ public class IrcFormatHelper { @NonNull private static final String urlChars = "(?:[,.;:]*[\\w~@/?&=+$()!%#*-])"; @NonNull - private static final String urlEnd = "(?:>|[,.;:\"]*\\s|\\b|$)"; + private static final String urlEnd = "((?:>|[,.;:\"]*\\s|\\b|$))"; @NonNull private static final Pattern urlPattern = Pattern.compile(String.format("\\b(%s%s(?:/%s*)?)%s", scheme, authority, urlChars, urlEnd), Pattern.CASE_INSENSITIVE); @NonNull @@ -94,7 +94,7 @@ public class IrcFormatHelper { SpannableString str = new SpannableString(context.deserializer().formatString(text)); Matcher urlMatcher = urlPattern.matcher(str); while (urlMatcher.find()) { - spans.add(new FutureClickableSpan(new CustomURLSpan(urlMatcher.group()), urlMatcher.start(), urlMatcher.end())); + spans.add(new FutureClickableSpan(new CustomURLSpan(urlMatcher.group(1)), urlMatcher.start(), urlMatcher.start()+urlMatcher.group(1).length())); } Matcher channelMatcher = channelPattern.matcher(str); while (channelMatcher.find()) { diff --git a/app/src/main/res/layout/activity_channel_detail.xml b/app/src/main/res/layout/activity_channel_detail.xml index 7185ee79460cc58471197ce1800dd28cfa3896dd..ba7bba87baab62845d72a5fad60d60be2e7d3c2c 100644 --- a/app/src/main/res/layout/activity_channel_detail.xml +++ b/app/src/main/res/layout/activity_channel_detail.xml @@ -29,7 +29,8 @@ <android.support.design.widget.AppBarLayout android:id="@+id/appBar" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" @@ -45,65 +46,73 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="4dp"> + android:orientation="vertical"> - <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" + <TextView + style="@style/TextAppearance.AppCompat.Button" android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?attr/colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="24dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="24dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Topic" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" /> - - <Space - android:layout_width="match_parent" - android:layout_height="16dp" /> - - <TextView - android:id="@+id/topic" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="02-18 04:14:03.854 3960-3988/de.kuschku.quasseldroid_ng W/ResourceType: Failure getting entry for 0x0108035f (t=7 e=863) (error -75)" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" /> - - </LinearLayout> - - </android.support.v7.widget.CardView> + android:layout_height="48dp" + android:textColor="?attr/colorAccent" + android:text="Topic" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:gravity="fill_vertical" /> <TextView - android:id="@+id/mode" - style="@style/TextAppearance.AppCompat.Title" + android:id="@+id/topic" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:layout_marginTop="16dp" /> + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:text="No Topic Set" + android:textStyle="italic" + android:textColor="?attr/colorForegroundSecondary" + android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" /> + + <android.support.v7.widget.AppCompatButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:id="@+id/edit_topic" + android:text="Edit Topic" + style="@style/Widget.AppCompat.Button.Colored" + android:layout_gravity="right" /> + + <View + android:layout_width="match_parent" + android:layout_height="1dp" + android:layout_marginTop="16dp" + android:background="?attr/material_drawer_divider" /> + + <TextView + style="@style/TextAppearance.AppCompat.Button" + android:layout_width="match_parent" + android:layout_height="48dp" + android:textColor="?attr/colorAccent" + android:text="Channel Modes" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp" + android:gravity="fill_vertical" /> <LinearLayout android:id="@+id/modes" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" /> + android:orientation="vertical" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:paddingBottom="8dp" /> </LinearLayout> </ScrollView> + <ProgressBar + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@+id/progressBar2" + android:layout_gravity="right" /> + </LinearLayout> diff --git a/app/src/main/res/layout/widget_channel_mode.xml b/app/src/main/res/layout/widget_channel_mode.xml index 4ac0dd6baf23c7d56c27b9e52869416568e872ae..c7a2b5363d8cd487fd7f3df670acc7b16f8280ff 100644 --- a/app/src/main/res/layout/widget_channel_mode.xml +++ b/app/src/main/res/layout/widget_channel_mode.xml @@ -40,16 +40,22 @@ android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Invite Only (+i)" android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" /> <TextView android:id="@+id/description" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Members must be invited to join this channel." android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" /> + <TextView + android:id="@+id/value" + android:layout_marginTop="8dp" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" + android:visibility="gone" /> + </LinearLayout> </android.support.v7.widget.CardView> diff --git a/app/src/main/res/values/strings_chanmodes.xml b/app/src/main/res/values/strings_chanmodes.xml index b55b8a2131a6bf18901a822fb48c83442ca2d969..26986d7995c7ae2b3efbd8d031f181d24c7ab1c2 100644 --- a/app/src/main/res/values/strings_chanmodes.xml +++ b/app/src/main/res/values/strings_chanmodes.xml @@ -134,4 +134,7 @@ <string name="chanMode_ONLY_ADMIN_NAME">Admin Only</string> <string name="chanMode_ONLY_ADMIN_DESCRIPTION">Allow only IRC admins to join the channel.</string> + + <string name="chanMode_FORWARD_NAME">Forward</string> + <string name="chanMode_FORWARD_DESCRIPTION">Forward users who can’t join the channel to another channel.</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c5a618699170840f76fa5114b43ae1ac8001b16a..2af2ed3c4942cff454044c7c12f627da9a620298 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -20,8 +20,8 @@ --> <resources> - <style name="BaseTheme" parent="MaterialDrawerTheme.TranslucentStatus" /> - <style name="BaseTheme.Light" parent="MaterialDrawerTheme.Light.DarkToolbar.TranslucentStatus" /> + <style name="BaseTheme" parent="MaterialDrawerTheme" /> + <style name="BaseTheme.Light" parent="MaterialDrawerTheme.Light.DarkToolbar" /> <!-- Base application theme. --> <style name="AppTheme" parent="BaseTheme">