<commit_before><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="?selectorStoryBackground" >

<!--
    This RelativeLayout really should be the top-most parent with a full width and wraped height. However,
    due to this being used in a scrollable ListView, the height of the favicon_borderbar would never be
    set, since the height of each row is calculated very lazily.  Wrapping the whole thing in an otherwise
    useless LinearLayout forces the heights to be calculated correctly every time.  If the lazy layout
    bug in scrolling ListViews can ever be fixed, the extra layout can be removed.
-->
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <View
        android:id="@+id/row_item_favicon_borderbar_1"
        android:layout_width="6dp"
        android:layout_height="match_parent" />

    <View
        android:id="@+id/row_item_favicon_borderbar_2"
        android:layout_width="6dp"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/row_item_favicon_borderbar_1" />

    <!--
        The next item to the right is actually the intel dot, but it has vertical bounds set relative to
        the story title height, so it cannot be declared until after the title row and associated bits.
        To prevent a cyclic layout dependency, we hard-code the left margin of everything to the right
        of the dot by assuming the width of it. In fact, much of the remaining layout is done from the
        right to the left.
    -->

    <ImageView
        android:id="@+id/row_item_thumbnail"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:layout_marginTop="1dp"
        android:layout_marginBottom="1dp"
        android:layout_alignParentRight="true"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/row_item_feedicon"
        android:layout_width="18dp"
        android:layout_height="18dp"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="33dp"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/row_item_feedtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:layout_marginTop="4dp"
        android:layout_toRightOf="@id/row_item_feedicon"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:ellipsize="end"
        android:singleLine="true"
        style="?storyFeedTitleText" />

    <ImageView
        android:id="@+id/row_item_saved_icon"
        android:src="@drawable/clock"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_below="@id/row_item_feedtitle"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginTop="2dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="8dp"
        android:visibility="gone" />

    <TextView
        android:id="@+id/row_item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_saved_icon"
        android:layout_below="@id/row_item_feedicon"
        android:layout_marginLeft="33dp"
        android:paddingTop="6dp"
        android:paddingBottom="4dp"
        android:paddingRight="4dp"
        android:maxLines="2"
        android:ellipsize="end" />

    <TextView
        android:id="@+id/row_item_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_below="@id/row_item_title"
        android:layout_marginLeft="33dp"
        android:paddingBottom="4dp"
        android:paddingRight="4dp"
        android:maxLines="2"
        android:ellipsize="end"
        style="?storySnippetText" />

    <TextView
        android:id="@+id/row_item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_alignWithParentIfMissing="true"
        android:layout_below="@id/row_item_content"
        android:paddingBottom="4dp"
        android:paddingRight="8dp"
        style="?storyDateText" />

    <TextView
        android:id="@+id/row_item_author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/row_item_content"
        android:layout_toLeftOf="@id/row_item_date"
        android:layout_alignLeft="@id/row_item_content"
        android:paddingBottom="4dp"
        android:ellipsize="end"<commit_msg>story row date and author justify to bottom when possible (#963)<commit_after><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="?selectorStoryBackground" >

<!--
    This RelativeLayout really should be the top-most parent with a full width and wraped height. However,
    due to this being used in a scrollable ListView, the height of the favicon_borderbar would never be
    set, since the height of each row is calculated very lazily.  Wrapping the whole thing in an otherwise
    useless LinearLayout forces the heights to be calculated correctly every time.  If the lazy layout
    bug in scrolling ListViews can ever be fixed, the extra layout can be removed.
-->
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <View
        android:id="@+id/row_item_favicon_borderbar_1"
        android:layout_width="6dp"
        android:layout_height="match_parent" />

    <View
        android:id="@+id/row_item_favicon_borderbar_2"
        android:layout_width="6dp"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/row_item_favicon_borderbar_1" />

    <!--
        The next item to the right is actually the intel dot, but it has vertical bounds set relative to
        the story title height, so it cannot be declared until after the title row and associated bits.
        To prevent a cyclic layout dependency, we hard-code the left margin of everything to the right
        of the dot by assuming the width of it. In fact, much of the remaining layout is done from the
        right to the left.
    -->

    <ImageView
        android:id="@+id/row_item_thumbnail"
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:layout_marginTop="1dp"
        android:layout_marginBottom="1dp"
        android:layout_alignParentRight="true"
        android:visibility="gone" />

    <ImageView
        android:id="@+id/row_item_feedicon"
        android:layout_width="18dp"
        android:layout_height="18dp"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="33dp"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/row_item_feedtitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:layout_marginTop="4dp"
        android:layout_toRightOf="@id/row_item_feedicon"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:ellipsize="end"
        android:singleLine="true"
        style="?storyFeedTitleText" />

    <ImageView
        android:id="@+id/row_item_saved_icon"
        android:src="@drawable/clock"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_below="@id/row_item_feedtitle"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginTop="2dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="8dp"
        android:visibility="gone" />

    <TextView
        android:id="@+id/row_item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_saved_icon"
        android:layout_below="@id/row_item_feedicon"
        android:layout_marginLeft="33dp"
        android:paddingTop="6dp"
        android:paddingBottom="4dp"
        android:paddingRight="4dp"
        android:maxLines="2"
        android:ellipsize="end" />

    <TextView
        android:id="@+id/row_item_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_below="@id/row_item_title"
        android:layout_marginLeft="33dp"
        android:paddingBottom="4dp"
        android:paddingRight="4dp"
        android:maxLines="2"
        android:ellipsize="end"
        style="?storySnippetText" />

    <TextView
        android:id="@+id/row_item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/row_item_thumbnail"
        android:layout_alignWithParentIfMissing="true"
        android:layout_below="@id/row_item_content"
        android:paddingBottom="2dp"
        android:paddingRight="8dp"
        style="?storyDateText" />

    <TextView
        android:id="@+id/row_item_author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/row_item_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="33dp"
        android:layout_toLeftOf="@id/row_item_date"
        android:paddingBottom="2dp"
        android:ellipsize="end"
{'fraction_non_alphanumeric': 0.09933440903590157, 'fraction_numerical': 0.009378781766841468, 'mean_word_length': 3.417371937639198, 'pattern_counts': {'":': 0, '<': 33, '<?xml version=': 2, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 4}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5621975', 'n_tokens_mistral': 2999, 'n_tokens_neox': 2836, 'n_words': 526}