mirror of https://github.com/ThmmyNoLife/mTHMMY
Ezerous
3 years ago
32 changed files with 2022 additions and 1019 deletions
@ -1,79 +1,64 @@ |
|||||
package gr.thmmy.mthmmy.activities.upload; |
package gr.thmmy.mthmmy.activities.upload; |
||||
|
|
||||
import android.os.Bundle; |
import org.json.JSONArray; |
||||
|
import org.json.JSONException; |
||||
|
import org.json.JSONObject; |
||||
|
|
||||
import java.util.HashMap; |
import java.util.HashMap; |
||||
import java.util.Map; |
|
||||
import java.util.regex.Matcher; |
|
||||
import java.util.regex.Pattern; |
|
||||
|
|
||||
import gr.thmmy.mthmmy.base.BaseApplication; |
|
||||
import timber.log.Timber; |
import timber.log.Timber; |
||||
|
|
||||
class UploadsCourse { |
public class UploadsCourse { |
||||
private String name; |
private final int id; |
||||
private String minifiedName; |
private final String name, minifiedName, greeklishName; |
||||
private String greeklishName; |
|
||||
|
|
||||
private UploadsCourse(String fullName, String minifiedName, String greeklishName) { |
private UploadsCourse(int id, String name, String minifiedName, String greeklishName) { |
||||
this.name = fullName; |
this.id = id; |
||||
|
this.name = name; |
||||
this.minifiedName = minifiedName; |
this.minifiedName = minifiedName; |
||||
this.greeklishName = greeklishName; |
this.greeklishName = greeklishName; |
||||
} |
} |
||||
|
|
||||
String getName() { |
public int getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public String getName() { |
||||
return name; |
return name; |
||||
} |
} |
||||
|
|
||||
String getMinifiedName() { |
public String getMinifiedName() { |
||||
return minifiedName; |
return minifiedName; |
||||
} |
} |
||||
|
|
||||
String getGreeklishName() { |
public String getGreeklishName() { |
||||
return greeklishName; |
return greeklishName; |
||||
} |
} |
||||
|
|
||||
static Map<String, UploadsCourse> generateUploadsCourses(String[] uploadsCoursesRes) { |
public static HashMap<Integer, UploadsCourse> generateCoursesFromJSON(JSONObject json) throws JSONException { |
||||
Map<String, UploadsCourse> uploadsCourses = new HashMap<>(); |
HashMap<Integer, UploadsCourse> coursesHashMap = new HashMap<>(); |
||||
for (String uploadsCourseStr : uploadsCoursesRes) { |
if(json.has("courses")){ |
||||
String[] split = uploadsCourseStr.split(":"); |
JSONArray coursesArray = json.getJSONArray("courses"); |
||||
UploadsCourse uploadsCourse = new UploadsCourse(split[0], split[1], split[2]); |
for(int i=0, size = coursesArray.length(); i<size; i++) { |
||||
uploadsCourses.put(uploadsCourse.getName(), uploadsCourse); |
JSONObject course = coursesArray.getJSONObject(i); |
||||
} |
int id = course.getInt("id"); |
||||
return uploadsCourses; |
String name = course.getString("name"); |
||||
|
String minifiedName = course.getString("minified"); |
||||
|
String greeklisName = course.getString("greeklish"); |
||||
|
if(coursesHashMap.containsKey(id)) |
||||
|
Timber.w("Added a duplicate id (%d) in uploads courses!", id); |
||||
|
coursesHashMap.put(id, new UploadsCourse(id, name, minifiedName, greeklisName)); |
||||
} |
} |
||||
|
|
||||
static UploadsCourse findCourse(String retrievedCourse, |
|
||||
Map<String, UploadsCourse> uploadsCourses) { |
|
||||
retrievedCourse = normalizeGreekNumbers(retrievedCourse); |
|
||||
UploadsCourse uploadsCourse = uploadsCourses.get(retrievedCourse); |
|
||||
if (uploadsCourse != null) return uploadsCourse; |
|
||||
|
|
||||
String foundKey = null; |
|
||||
for (Map.Entry<String, UploadsCourse> entry : uploadsCourses.entrySet()) { |
|
||||
String key = entry.getKey(); |
|
||||
if ((key.contains(retrievedCourse) || retrievedCourse.contains(key)) |
|
||||
&& (foundKey == null || key.length() > foundKey.length())) |
|
||||
foundKey = key; |
|
||||
} |
} |
||||
|
|
||||
if (foundKey == null) { |
if(json.has("categories")){ |
||||
Timber.w("Couldn't find course that matches %s", retrievedCourse); |
JSONArray categoriesArray = json.getJSONArray("categories"); |
||||
Bundle bundle = new Bundle(); |
for(int i=0, size = categoriesArray.length(); i<size; i++) { |
||||
bundle.putString("course_name", retrievedCourse); |
JSONObject category = categoriesArray.getJSONObject(i); |
||||
BaseApplication.getInstance().logFirebaseAnalyticsEvent("unsupported_uploads_course", bundle); |
coursesHashMap.putAll(generateCoursesFromJSON(category)); |
||||
return null; |
|
||||
} |
} |
||||
|
|
||||
return uploadsCourses.get(foundKey); |
|
||||
} |
} |
||||
|
|
||||
private static String normalizeGreekNumbers(String stringWithGreekNumbers) { |
return coursesHashMap; |
||||
StringBuilder normalizedStrBuilder = new StringBuilder(stringWithGreekNumbers); |
|
||||
Pattern pattern = Pattern.compile("(Ι+)(?:\\s|\\(|\\)|$)"); |
|
||||
Matcher matcher = pattern.matcher(stringWithGreekNumbers); |
|
||||
while (matcher.find()) |
|
||||
normalizedStrBuilder.replace(matcher.start(1), matcher.end(1), matcher.group(1).replaceAll("Ι", "I")); |
|
||||
return normalizedStrBuilder.toString(); |
|
||||
} |
} |
||||
} |
} |
||||
|
@ -0,0 +1,46 @@ |
|||||
|
package gr.thmmy.mthmmy.utils.io; |
||||
|
|
||||
|
import android.content.res.Resources; |
||||
|
|
||||
|
import java.io.BufferedReader; |
||||
|
import java.io.InputStream; |
||||
|
import java.io.InputStreamReader; |
||||
|
import java.io.StringWriter; |
||||
|
import java.io.Writer; |
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
|
||||
|
import timber.log.Timber; |
||||
|
|
||||
|
public class ResourceUtils { |
||||
|
public static String readJSONResourceToString(Resources resources, int id) { |
||||
|
InputStream inputStream = resources.openRawResource(id); |
||||
|
return readStream(inputStream); |
||||
|
} |
||||
|
|
||||
|
public static String readJSONResourceToString(InputStream inputStream) { |
||||
|
return readStream(inputStream); |
||||
|
} |
||||
|
|
||||
|
private static String readStream(InputStream inputStream) { |
||||
|
Writer writer = new StringWriter(); |
||||
|
try { |
||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); |
||||
|
String line = reader.readLine(); |
||||
|
while (line != null) { |
||||
|
writer.write(line); |
||||
|
line = reader.readLine(); |
||||
|
} |
||||
|
} catch (Exception e) { |
||||
|
Timber.e(e, "Unhandled exception while using readJSONFromResource"); |
||||
|
} finally { |
||||
|
try { |
||||
|
inputStream.close(); |
||||
|
} catch (Exception e) { |
||||
|
Timber.e(e, "Unhandled exception while using readJSONFromResource"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return writer.toString(); |
||||
|
} |
||||
|
} |
||||
|
|
@ -1,124 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto" |
|
||||
xmlns:tools="http://schemas.android.com/tools" |
|
||||
android:id="@+id/main_content" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:fitsSystemWindows="true" |
|
||||
tools:context=".activities.profile.ProfileActivity"> |
|
||||
|
|
||||
<com.google.android.material.appbar.AppBarLayout |
|
||||
android:id="@+id/appbar" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:paddingTop="@dimen/appbar_padding_top" |
|
||||
android:theme="@style/ToolbarTheme"> |
|
||||
|
|
||||
<com.google.android.material.appbar.CollapsingToolbarLayout |
|
||||
android:id="@+id/main_collapsing" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:fitsSystemWindows="true" |
|
||||
app:contentScrim="?attr/colorPrimary" |
|
||||
app:expandedTitleMarginEnd="64dp" |
|
||||
app:expandedTitleMarginStart="48dp" |
|
||||
app:layout_scrollFlags="scroll|exitUntilCollapsed"> |
|
||||
|
|
||||
<LinearLayout |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_marginTop="5dp" |
|
||||
android:gravity="center" |
|
||||
android:orientation="vertical"> |
|
||||
|
|
||||
<ImageView |
|
||||
android:id="@+id/user_thumbnail" |
|
||||
android:layout_width="@dimen/profile_activity_avatar_size" |
|
||||
android:layout_height="@dimen/profile_activity_avatar_size" |
|
||||
android:layout_marginBottom="6dp" |
|
||||
android:layout_gravity="center" |
|
||||
android:adjustViewBounds="true" |
|
||||
android:contentDescription="@string/post_thumbnail" |
|
||||
android:fitsSystemWindows="true" |
|
||||
android:transitionName="user_thumbnail" |
|
||||
app:layout_collapseMode="parallax" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/profile_activity_personal_text" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_gravity="center" |
|
||||
android:paddingStart="16dp" |
|
||||
android:paddingEnd="16dp" |
|
||||
android:paddingTop="6dp" |
|
||||
android:paddingBottom="4dp" |
|
||||
android:textAlignment="center" |
|
||||
android:textColor="@color/primary_text" |
|
||||
android:visibility="gone" /> |
|
||||
</LinearLayout> |
|
||||
</com.google.android.material.appbar.CollapsingToolbarLayout> |
|
||||
|
|
||||
<androidx.appcompat.widget.Toolbar |
|
||||
android:id="@+id/toolbar" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="?attr/actionBarSize" |
|
||||
android:background="?attr/colorPrimary" |
|
||||
android:gravity="center" |
|
||||
app:popupTheme="@style/ToolbarTheme"> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/profile_activity_username" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_gravity="center" |
|
||||
android:paddingBottom="2dp" |
|
||||
android:text="@string/username" |
|
||||
android:textColor="@color/accent" |
|
||||
android:textSize="25sp" /> |
|
||||
</androidx.appcompat.widget.Toolbar> |
|
||||
|
|
||||
<com.google.android.material.tabs.TabLayout |
|
||||
android:id="@+id/profile_tabs" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:gravity="center" |
|
||||
app:tabGravity="fill" |
|
||||
app:tabMode="fixed" |
|
||||
app:tabSelectedTextColor="@color/accent" |
|
||||
app:tabTextColor="@color/white" /> |
|
||||
</com.google.android.material.appbar.AppBarLayout> |
|
||||
|
|
||||
<androidx.viewpager.widget.ViewPager |
|
||||
android:id="@+id/profile_tab_container" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:layout_gravity="top|start" |
|
||||
android:background="@color/background" |
|
||||
app:layout_anchor="@id/appbar" |
|
||||
app:layout_anchorGravity="bottom|center" |
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" /> |
|
||||
|
|
||||
<me.zhanghai.android.materialprogressbar.MaterialProgressBar |
|
||||
android:id="@+id/progressBar" |
|
||||
style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="@dimen/progress_bar_height" |
|
||||
android:indeterminate="true" |
|
||||
android:visibility="invisible" |
|
||||
app:layout_anchor="@id/profile_tab_container" |
|
||||
app:layout_anchorGravity="top|center" |
|
||||
app:mpb_indeterminateTint="@color/accent" |
|
||||
app:mpb_progressStyle="horizontal" /> |
|
||||
|
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton |
|
||||
android:id="@+id/profile_fab" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_gravity="bottom|end" |
|
||||
android:layout_margin="@dimen/fab_margins" |
|
||||
app:layout_behavior="gr.thmmy.mthmmy.utils.ui.ScrollAwareFABBehavior" |
|
||||
app:srcCompat="@drawable/ic_pm_fab" /> |
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout> |
|
||||
|
|
||||
|
|
@ -1,262 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto" |
|
||||
xmlns:tools="http://schemas.android.com/tools" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:orientation="vertical" |
|
||||
android:paddingEnd="4dp" |
|
||||
android:paddingStart="4dp" |
|
||||
tools:ignore="SmallSp"> |
|
||||
|
|
||||
<androidx.cardview.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" |
|
||||
android:id="@+id/card_view" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:layout_gravity="center" |
|
||||
android:foreground="?android:attr/selectableItemBackground" |
|
||||
card_view:cardBackgroundColor="@color/background_light" |
|
||||
card_view:cardCornerRadius="5dp" |
|
||||
card_view:cardElevation="2dp" |
|
||||
card_view:cardPreventCornerOverlap="false" |
|
||||
card_view:cardUseCompatPadding="true"> |
|
||||
|
|
||||
<LinearLayout |
|
||||
android:id="@+id/card_child_linear" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:orientation="vertical"> |
|
||||
|
|
||||
<LinearLayout |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:orientation="horizontal"> |
|
||||
|
|
||||
<RelativeLayout |
|
||||
android:id="@+id/header" |
|
||||
android:layout_width="0dp" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_weight="1" |
|
||||
android:clickable="true" |
|
||||
android:focusable="true" |
|
||||
android:paddingLeft="16dp" |
|
||||
android:paddingRight="16dp" |
|
||||
android:paddingTop="16dp"> |
|
||||
|
|
||||
<FrameLayout |
|
||||
android:id="@+id/thumbnail_holder" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_alignParentTop="true" |
|
||||
android:layout_centerVertical="true" |
|
||||
android:layout_marginEnd="16dp"> |
|
||||
|
|
||||
<ImageView |
|
||||
android:id="@+id/thumbnail" |
|
||||
android:layout_width="@dimen/thumbnail_size" |
|
||||
android:layout_height="@dimen/thumbnail_size" |
|
||||
android:layout_gravity="center" |
|
||||
android:adjustViewBounds="true" |
|
||||
android:contentDescription="@string/post_thumbnail" |
|
||||
android:transitionName="user_thumbnail" |
|
||||
app:srcCompat="@drawable/ic_default_user_avatar_darker" /> |
|
||||
</FrameLayout> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/username" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_alignParentTop="true" |
|
||||
android:layout_toEndOf="@+id/thumbnail_holder" |
|
||||
android:ellipsize="end" |
|
||||
android:maxLines="1" |
|
||||
android:text="@string/post_author" |
|
||||
android:textColor="@color/primary_text" |
|
||||
android:textStyle="bold" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/subject" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_below="@+id/username" |
|
||||
android:layout_toEndOf="@+id/thumbnail_holder" |
|
||||
android:ellipsize="end" |
|
||||
android:maxLines="1" |
|
||||
android:text="@string/post_subject" /> |
|
||||
</RelativeLayout> |
|
||||
|
|
||||
<ImageButton |
|
||||
android:id="@+id/toggle_quote_button" |
|
||||
android:layout_width="@dimen/post_image_button" |
|
||||
android:layout_height="@dimen/post_image_button" |
|
||||
android:layout_marginTop="9dp" |
|
||||
android:background="@color/background_light" |
|
||||
android:clickable="true" |
|
||||
android:contentDescription="@string/post_quote_button" |
|
||||
android:focusable="true" |
|
||||
app:srcCompat="@drawable/ic_format_quote_unchecked_24dp" /> |
|
||||
<!--<ImageButton |
|
||||
android:id="@+id/post_share_button" |
|
||||
android:layout_width="@dimen/post_image_button" |
|
||||
android:layout_height="@dimen/post_image_button" |
|
||||
android:layout_marginEnd="9dp" |
|
||||
android:layout_marginTop="9dp" |
|
||||
android:background="@color/card_background" |
|
||||
android:clickable="true" |
|
||||
android:contentDescription="@string/post_share_button" |
|
||||
android:focusable="true" |
|
||||
android:src="@drawable/ic_share" />--> |
|
||||
<ImageButton |
|
||||
android:id="@+id/post_overflow_menu" |
|
||||
android:layout_width="@dimen/post_image_button" |
|
||||
android:layout_height="@dimen/post_image_button" |
|
||||
android:layout_marginTop="9dp" |
|
||||
android:layout_marginEnd="9dp" |
|
||||
android:background="@color/background_light" |
|
||||
android:clickable="true" |
|
||||
android:contentDescription="@string/post_overflow_menu_button" |
|
||||
android:focusable="true" |
|
||||
app:srcCompat="@drawable/ic_more_vert_white_24dp" /> |
|
||||
</LinearLayout> |
|
||||
|
|
||||
<LinearLayout |
|
||||
android:id="@+id/user_extra_info" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:clickable="true" |
|
||||
android:focusable="true" |
|
||||
android:orientation="vertical" |
|
||||
android:paddingLeft="16dp" |
|
||||
android:paddingRight="16dp" |
|
||||
android:paddingTop="3dp" |
|
||||
android:visibility="gone" |
|
||||
android:weightSum="1.0"> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/special_rank" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:textColor="@color/card_expand_text_color" |
|
||||
android:textSize="10sp" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/rank" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:textColor="@color/card_expand_text_color" |
|
||||
android:textSize="10sp" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/stars" |
|
||||
android:layout_width="wrap_content" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_marginTop="2dp" |
|
||||
android:textSize="10sp" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/gender" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:textColor="@color/card_expand_text_color" |
|
||||
android:textSize="10sp" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/number_of_posts" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:textColor="@color/card_expand_text_color" |
|
||||
android:textSize="10sp" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/personal_text" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:textColor="@color/card_expand_text_color" |
|
||||
android:textSize="10sp" |
|
||||
android:textStyle="italic" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
</LinearLayout> |
|
||||
|
|
||||
<FrameLayout |
|
||||
android:id="@+id/post_date_and_number_exp" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_marginLeft="16dp" |
|
||||
android:layout_marginRight="16dp" |
|
||||
android:layout_marginTop="16dp"> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/post_date" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:gravity="start" |
|
||||
android:text="" |
|
||||
android:textColor="@color/accent" |
|
||||
android:textSize="11sp" /> |
|
||||
|
|
||||
<TextView |
|
||||
android:id="@+id/post_number" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:gravity="end" |
|
||||
android:text="" |
|
||||
android:textColor="@color/accent" |
|
||||
android:textSize="11sp" /> |
|
||||
</FrameLayout> |
|
||||
|
|
||||
|
|
||||
<View |
|
||||
android:id="@+id/header_body_divider" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="1dp" |
|
||||
android:layout_marginBottom="9dp" |
|
||||
android:layout_marginLeft="16dp" |
|
||||
android:layout_marginRight="16dp" |
|
||||
android:layout_marginTop="5dp" |
|
||||
android:background="@color/divider" /> |
|
||||
|
|
||||
<FrameLayout |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="match_parent" |
|
||||
android:layout_marginBottom="16dp" |
|
||||
android:descendantFocusability="blocksDescendants"> |
|
||||
|
|
||||
<gr.thmmy.mthmmy.views.ReactiveWebView |
|
||||
android:id="@+id/post" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:layout_gravity="center" |
|
||||
android:layout_marginLeft="16dp" |
|
||||
android:layout_marginRight="16dp" |
|
||||
android:background="@color/background_light" |
|
||||
android:text="@string/post" /> |
|
||||
</FrameLayout> |
|
||||
|
|
||||
<View |
|
||||
android:id="@+id/body_footer_divider" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="1dp" |
|
||||
android:layout_marginBottom="5dp" |
|
||||
android:layout_marginLeft="16dp" |
|
||||
android:layout_marginRight="16dp" |
|
||||
android:layout_marginTop="9dp" |
|
||||
android:background="@color/divider" |
|
||||
android:visibility="gone" /> |
|
||||
|
|
||||
<LinearLayout |
|
||||
android:id="@+id/post_footer" |
|
||||
android:layout_width="match_parent" |
|
||||
android:layout_height="wrap_content" |
|
||||
android:orientation="vertical" |
|
||||
android:paddingBottom="9dp" |
|
||||
android:paddingLeft="16dp" |
|
||||
android:paddingRight="16dp" /> |
|
||||
</LinearLayout> |
|
||||
</androidx.cardview.widget.CardView> |
|
||||
</LinearLayout> |
|
File diff suppressed because it is too large
@ -1,11 +0,0 @@ |
|||||
<resources> |
|
||||
|
|
||||
<style name="AppTheme" parent="BaseAppTheme"> |
|
||||
<item name="android:windowContentTransitions">true</item> |
|
||||
</style> |
|
||||
|
|
||||
<style name="AppTheme.NoActionBar" parent="BaseAppTheme.NoActionBar"> |
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item> |
|
||||
<item name="android:statusBarColor">@android:color/transparent</item> |
|
||||
</style> |
|
||||
</resources> |
|
@ -1,158 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8"?> |
|
||||
<resources> |
|
||||
<!--Format: Original:Minified:Greeklish--> |
|
||||
<string-array name="string_array_uploads_courses"> |
|
||||
<item>Ακουστική I:Ακουστική 1:Akoustiki_I</item> |
|
||||
<item>Ακουστική II:Ακουστική 2:Akoustiki_II</item> |
|
||||
<item>Ανάλυση Ηλεκτρικών Κυκλωμάτων με Υπολογιστή:Ανάλυση Ηλεκτρικ. Κυκλ. με Υπολογιστή:Analysi_Ilektr_Kykl</item> |
|
||||
<item>Ανάλυση Συστημάτων Ηλεκτρικής Ενέργειας:ΑΣΗΕ:ASHE</item> |
|
||||
<item>Ανάλυση Χρονοσειρών:Χρονοσειρές:Xronoseires</item> |
|
||||
<item>Ανάλυση και Σχεδίαση Αλγορίθμων:Αλγόριθμοι:Algorithms</item> |
|
||||
<item>Αναγνώριση Προτύπων:Αναγνώριση Προτύπων:protipa</item> |
|
||||
<item>Αναλογικές Τηλεπικοινωνίες (πρώην Τηλεπικοινωνιακά Συστήματα I):Αναλογικές Τηλεπ.:Anal_Tilep</item> |
|
||||
<item>Αντικειμενοστραφής Προγραμματισμός:Αντικειμενοστραφής:OOP</item> |
|
||||
<item>Αξιοπιστία Συστημάτων:Αξιοπιστία Συστημάτων:Aksiopistia_Systimaton</item> |
|
||||
<item>Αριθμητική Ανάλυση:Αριθμ. Ανάλυση:Arith_Anal</item> |
|
||||
<item>Αρχές Οικονομίας:Αρχές Οικονομίας:Arx_Oikonomias</item> |
|
||||
<item>Αρχές Παράλληλης Επεξεργασίας:Αρχές Παράλληλης Επεξεργασίας:Arxes_Parall_Epeksergasias</item> |
|
||||
<item>Αρχιτεκτονική Υπολογιστών:Αρχ. Υπολογιστών:Arx_Ypologiston</item> |
|
||||
<item>Ασαφή Συστήματα:Ασαφή:Asafi</item> |
|
||||
<item>Ασφάλεια Πληροφοριακών Συστημάτων:Ασφάλεια:Asfaleia</item> |
|
||||
<item>Ασύρματος Τηλεπικοινωνία I:Ασύρματος 1:Asyrmatos_I</item> |
|
||||
<item>Ασύρματος Τηλεπικοινωνία II:Ασύρματος 2:Asyrmatos_II</item> |
|
||||
<item>Βάσεις Δεδομένων:Βάσεις:Vaseis</item> |
|
||||
<item>Βιομηχανικά Ηλεκτρονικά:Βιομηχανικά Ηλεκτρονικά:Viomix_Ilektronika</item> |
|
||||
<item>Βιομηχανική Πληροφορική:Βιομηχανική Πληρ:Viomix_Plir</item> |
|
||||
<item>Βιοϊατρική Τεχνολογία:Βιοιατρική:Vioiatriki</item> |
|
||||
<item>Γεωηλεκτρομαγνητισμός:Γεωηλεκτρομαγνητισμός:Geoilektromagnitismos</item> |
|
||||
<item>Γραμμική Άλγεβρα:Γραμμ. Άλγεβρ.:Grammiki_Algevra</item> |
|
||||
<item>Γραφική με Υπολογιστές:Γραφική:Grafiki</item> |
|
||||
<item>Δίκτυα Τηλεπικοινωνιών:Δίκτυα Τηλέπ.:Diktya_Tilep</item> |
|
||||
<item>Δίκτυα Υπολογιστών I:Δίκτυα 1:Diktya_I</item> |
|
||||
<item>Δίκτυα Υπολογιστών II:Δίκτυα 2:Diktya_II</item> |
|
||||
<item>Διάδοση Η/Μ Κύματος II:Διάδοση 2:Diadosi_II</item> |
|
||||
<item>Διάδοση Ηλεκτρομαγνητικού Κύματος I (πρώην Πεδίο III):Διάδοση 1:Diadosi_I</item> |
|
||||
<item>Διακριτά Μαθηματικά:Διακριτά Μαθηματικά:Diakrita</item> |
|
||||
<item>Διακριτά μαθηματικά:Διακριτά Μαθηματικά:Diakrita</item> |
|
||||
<item>Διανεμημένη Παραγωγή:Διανεμημένη Παραγωγή:Dian_Paragogi</item> |
|
||||
<item>Διατάξεις Υψηλών Συχνοτήτων:ΔΥΣ:DYS</item> |
|
||||
<item>Διαφορικές Εξισώσεις:Διαφορικές:Diaforikes</item> |
|
||||
<item>Διαχείριση Συστημάτων Ηλεκτρικής Ενέργειας:ΔΣΗΕ:DSHE</item> |
|
||||
<item>Δομές Δεδομένων:Δομ. Δεδομ.:Domes_Dedomenon</item> |
|
||||
<item>Δομημένος Προγραμματισμός:Δομ. Προγραμμ.:C</item> |
|
||||
<item>Ειδικά Κεφάλαια Διαφορικών Εξισώσεων:Ειδικά Κεφάλαια Διαφορικών Εξισώσεων:Eidika_Kef_Diaf_Eksis</item> |
|
||||
<item>Ειδικά Κεφάλαια Ηλεκτρομαγνητικού Πεδίου I:Ειδικά Κεφάλαια Ηλεκτρομαγνητικού Πεδίου I:Eidika_Kef_HM_Pediou_I</item> |
|
||||
<item>Ειδικά Κεφάλαια Συστημάτων Ηλεκτρικής Ενέργειας:ΕΚΣΗΕ:EKSHE</item> |
|
||||
<item>Ειδικές Αρχιτεκτονικές Υπολογιστών:Ειδικές Αρχιτεκτονικές Υπολογιστών:Eidikes_Arx_Ypolog</item> |
|
||||
<item>Ειδικές Κεραίες, Σύνθεση Κεραιών:Ειδικές Κεραίες, Σύνθεση Κεραιών:Eidikes_Keraies</item> |
|
||||
<item>Εισαγωγή στην Ενεργειακή Τεχνολογία I:ΕΕΤ 1:EET_I</item> |
|
||||
<item>Εισαγωγή στην Ενεργειακή Τεχνολογία II:ΕΕΤ2:EET_II</item> |
|
||||
<item>Εισαγωγή στην Πολιτική Οικονομία:Πολιτική Οικονομία:Polit_Oik</item> |
|
||||
<item>Εισαγωγή στις εφαρμογές Πυρηνικής Τεχνολογίας:Εισ. Πυρηνικη Τεχν.:Intro_Pyriniki_Texn</item> |
|
||||
<item>Ενσωματωμένα Συστήματα Πραγματικού Χρόνου:Ενσωματωμένα:Enswmatwmena</item> |
|
||||
<item>Επιχειρησιακή Έρευνα:Επιχειρησιακή Έρευνα:Epixeirisiaki</item> |
|
||||
<item>Ευρυζωνικά Δίκτυα:Ευρυζωνικά:Evryzonika</item> |
|
||||
<item>Ευφυή Συστήματα Ρομπότ:Ευφυή:eufuh</item> |
|
||||
<item>Εφαρμογές Τηλεπικοινωνιακών Διατάξεων:Εφαρμογές Τηλεπ. Διατάξεων:Efarm_Tilep_Diatakseon</item> |
|
||||
<item>Εφαρμοσμένα Μαθηματικά I:Εφαρμοσμένα 1:Efarmosmena_Math_I</item> |
|
||||
<item>Εφαρμοσμένα Μαθηματικά II:Εφαρμοσμένα 2:Efarmosmena_Math_II</item> |
|
||||
<item>Εφαρμοσμένη Θερμοδυναμική:Θερμοδυναμική:Thermodynamiki</item> |
|
||||
<item>Ηλεκτρακουστική I:Ηλεκτρακουστική 1:Ilektrakoustiki_I</item> |
|
||||
<item>Ηλεκτρακουστική II:Ηλεκτρακουστική 2:Ilektrakoustiki_II</item> |
|
||||
<item>Ηλεκτρικά Κυκλώματα I:Κυκλώματα 1:Kyklomata_I</item> |
|
||||
<item>Ηλεκτρικά Κυκλώματα II:Κυκλώματα 2:Kyklomata_II</item> |
|
||||
<item>Ηλεκτρικά Κυκλώματα III:Κυκλώματα 3:Kyklomata_I</item> |
|
||||
<item>Ηλεκτρικές Μετρήσεις I:Μετρήσεις 1:Metriseis_I</item> |
|
||||
<item>Ηλεκτρικές Μετρήσεις II:Μετρήσεις 2:Metriseis_II</item> |
|
||||
<item>Ηλεκτρικές Μηχανές I:Μηχανές I:Mixanes_I</item> |
|
||||
<item>Ηλεκτρικές Μηχανές Α\':Μηχανές Α:Mixanes_A</item> |
|
||||
<item>Ηλεκτρικές Μηχανές Β\':Μηχανές Β:Mixanes_B</item> |
|
||||
<item>Ηλεκτρικές Μηχανές Γ\':Μηχανές Γ:Mixanes_C</item> |
|
||||
<item>Ηλεκτρική Οικονομία:Ηλεκτρική Οικονομία:Ilektr_Oikonomia</item> |
|
||||
<item>Ηλεκτρολογικά Υλικά:Ηλεκτρ. Υλικά:Ylika</item> |
|
||||
<item>Ηλεκτρομαγνητική Συμβατότητα:H/M Συμβατότητα:HM_Symvatotita</item> |
|
||||
<item>Ηλεκτρομαγνητικό Πεδίο I:Πεδίο 1:Pedio_I</item> |
|
||||
<item>Ηλεκτρομαγνητικό Πεδίο II:Πεδίο 2:Pedio_II</item> |
|
||||
<item>Ηλεκτρονικά Ισχύος I:Ισχύος 1:Isxyos_I</item> |
|
||||
<item>Ηλεκτρονικά Ισχύος II:Ισχύος 2:Isxyos_II</item> |
|
||||
<item>Ηλεκτρονικές Διατάξεις και Μετρήσεις:Ηλεκτρονικές Διατάξεις και Μετρήσεις:Ilektron_Diatakseis_Metriseis</item> |
|
||||
<item>Ηλεκτρονική I:Ηλεκτρονική 1:Ilektroniki_I</item> |
|
||||
<item>Ηλεκτρονική II:Ηλεκτρονική 2:Ilektroniki_II</item> |
|
||||
<item>Ηλεκτρονική III:Ηλεκτρονική 3:Ilektroniki_III</item> |
|
||||
<item>Ημιαγωγά Υλικά: Θεωρία-Διατάξεις:Ημιαγωγά Υλικά:Imiagoga_Ylika</item> |
|
||||
<item>Θεωρία Πιθανοτήτων και Στατιστική:Πιθανότητες:Pithanotites</item> |
|
||||
<item>Θεωρία Πληροφοριών:Θεωρία Πληρ.:Theoria_Plir</item> |
|
||||
<item>Θεωρία Σημάτων και Γραμμικών Συστημάτων:Σήματα & Συστήματα:Analog_Sima</item> |
|
||||
<item>Θεωρία Σκέδασης:Σκέδαση:Skedasi</item> |
|
||||
<item>Θεωρία Υπολογισμών και Αλγορίθμων:ΘΥΑ:THYA</item> |
|
||||
<item>Θεωρία και Τεχνολογία Πυρηνικών Αντιδραστήρων:Τεχνολογία Αντιδραστήρων:Texn_Antidrasthron</item> |
|
||||
<item>Κβαντική Φυσική:Κβαντική:Kvantiki</item> |
|
||||
<item>Κινητές και Δορυφορικές Επικοινωνίες:Κινητές & Δορυφορικές Επικοινωνίες:Kinites_Doryforikes_Epik</item> |
|
||||
<item>Λειτουργικά Συστήματα:Λειτουργικά:OS</item> |
|
||||
<item>Λογική Σχεδίαση:Λογική Σχεδίαση:Logiki_Sxediasi</item> |
|
||||
<item>Λογισμός I:Λογισμός 1:Logismos_I</item> |
|
||||
<item>Λογισμός II:Λογισμός 2:Logismos_II</item> |
|
||||
<item>Μετάδοση Θερμότητας:Μετάδοση Θερμ.:Metadosi_Therm</item> |
|
||||
<item>Μικροεπεξεργαστές και Περιφερειακά:Μίκρο 2:Mikro_II</item> |
|
||||
<item>Μικροκυματική Τηλεπισκόπηση:Τηλεπισκόπηση:Tilepiskopisi</item> |
|
||||
<item>Μικροκύματα I:Μικροκύματα 1:Mikrokymata_I</item> |
|
||||
<item>Μικροκύματα II:Μικροκύματα 2:Mikrokymata_II</item> |
|
||||
<item>Οπτικές Επικοινωνίες:Οπτικές Τηλεπ.:Optikes_Tilep</item> |
|
||||
<item>Οπτική I:Οπτική 1:Optiki_I</item> |
|
||||
<item>Οπτική II:Οπτική 2:Optiki_II</item> |
|
||||
<item>Οργάνωση Υπολογιστών:Οργάνωση Υπολ.:Org_Ypol</item> |
|
||||
<item>Οργάνωση και Διοίκηση Εργοστασίων:Οργάνωση και Διοίκηση Εργοστασίων:Organ_Dioik_Ergostasion</item> |
|
||||
<item>Παράλληλα και Κατανεμημένα Συστήματα:Παράλληλα:Parallila</item> |
|
||||
<item>Προγραμματιζόμενα Κυκλώματα ASIC:ASIC:ASIC</item> |
|
||||
<item>Προγραμματιστικές Τεχνικές:Προγραμματ. Τεχν.:CPP</item> |
|
||||
<item>Προηγμένες Τεχνικές Επεξεργασίας Σήματος:ΠΤΕΣ:PTES</item> |
|
||||
<item>Προσομοίωση και Μοντελοποίηση Συστημάτων:Μοντελοποίηση:Montelopoiisi</item> |
|
||||
<item>Ρομποτική:Ρομποτική:Robotiki</item> |
|
||||
<item>Σήματα και Συστήματα:Σήματα & Συστήματα:Analog_Sima</item> |
|
||||
<item>Σερβοκινητήρια Συστήματα:Σέρβο:Servo</item> |
|
||||
<item>Σταθμοί Παραγωγής Ηλεκτρικής Ενέργειας:ΣΠΗΕ:SPHE</item> |
|
||||
<item>Στοχαστικά Σήματα και Διαδικασίες:Στοχαστικό:Stochastic</item> |
|
||||
<item>Στοχαστικό Σήμα:Στοχαστικό:Stochastic</item> |
|
||||
<item>Συστήματα Αυτομάτου Ελέγχου I:ΣΑΕ 1:SAE_I</item> |
|
||||
<item>Συστήματα Αυτομάτου Ελέγχου II:ΣΑΕ 2:SAE_II</item> |
|
||||
<item>Συστήματα Αυτομάτου Ελέγχου III:ΣΑΕ 3:SAE_III</item> |
|
||||
<item>Συστήματα Ηλεκτρικής Ενέργειας I:ΣΗΕ 1:SHE_I</item> |
|
||||
<item>Συστήματα Ηλεκτρικής Ενέργειας II:ΣΗΕ 2:SHE_II</item> |
|
||||
<item>Συστήματα Ηλεκτρικής Ενέργειας III:ΣΗΕ 3:SHE_III</item> |
|
||||
<item>Συστήματα Ηλεκτροκίνησης:Ηλεκτροκίνηση:Ilektrokinisi</item> |
|
||||
<item>Συστήματα Μικροϋπολογιστών:Μίκρο 1:Mikro_I</item> |
|
||||
<item>Συστήματα Πολυμέσων και Εικονική Πραγματικότητα:Πολυμέσα:Polymesa</item> |
|
||||
<item>Συστήματα Υπολογιστών (Υπολογιστικά Συστήματα):Συσ. Υπολογιστών:Sys_Ypologiston</item> |
|
||||
<item>Σχεδίαση Συστημάτων VLSI:VLSI:VLSI</item> |
|
||||
<item>Σύνθεση Ενεργών και Παθητικών Κυκλωμάτων:Σύνθεση:Synthesi</item> |
|
||||
<item>Σύνθεση Τηλεπικοινωνιακών Διατάξεων:Σύνθεση Τηλεπ. Διατάξεων:Synth_Tilep_Diatakseon</item> |
|
||||
<item>Τεχνικές Βελτιστοποίησης:Βελτιστοποίηση:Veltistopoiisi</item> |
|
||||
<item>Τεχνικές Κωδικοποίησης:Τεχνικές Κωδικοποίησης:Texn_Kodikopoiisis</item> |
|
||||
<item>Τεχνικές Σχεδίασης με Η/Υ:Σχέδιο:sxedio</item> |
|
||||
<item>Τεχνικές μη Καταστρεπτικών Δοκιμών:Μη Καταστρεπτικές Δοκιμές:Non_Destructive_Tests</item> |
|
||||
<item>Τεχνική Μηχανική:Τεχν. Μηχαν.:Texn_Mixan</item> |
|
||||
<item>Τεχνολογία Ήχου και Εικόνας:Τεχνολογία Ήχου και Εικόνας:Texn_Ixou_Eikonas</item> |
|
||||
<item>Τεχνολογία Ηλεκτροτεχνικών Υλικών:Ηλεκτροτεχνικά Υλικά:Ilektrotexnika_Ylika</item> |
|
||||
<item>Τεχνολογία Λογισμικού:Τεχνολογία Λογισμικού:SE</item> |
|
||||
<item>Τηλεοπτικά Συστήματα:Τηλεοπτικά:Tileoptika</item> |
|
||||
<item>Τηλεπικοινωνιακά Συστήματα I:Τηλεπικοινωνιακά I:Tilepikoinoniaka_I</item> |
|
||||
<item>Τηλεπικοινωνιακά Συστήματα II:Τηλεπικοινωνιακά II:Tilepikoinoniaka_II</item> |
|
||||
<item>Τηλεπικοινωνιακή Ηλεκτρονική:Τηλεπ. Ηλεκτρ.:Tilep_Ilektr</item> |
|
||||
<item>Υπολογιστικές Μέθοδοι στα Ενεργειακά Συστήματα:ΥΜΕΣ:YMES</item> |
|
||||
<item>Υπολογιστικός Ηλεκτρομαγνητισμός:Υπολογιστικός Η/Μ:Ypologistikos_HM</item> |
|
||||
<item>Υψηλές Τάσεις I:Υψηλές 1:Ypsiles_I</item> |
|
||||
<item>Υψηλές Τάσεις II:Υψηλές 2:Ypsiles_II</item> |
|
||||
<item>Υψηλές Τάσεις III:Υψηλές 3:Ypsiles_III</item> |
|
||||
<item>Υψηλές Τάσεις 4:Υψηλές 4:Ypsiles_IV</item> |
|
||||
<item>Φυσική I:Φυσική 1:Fysiki_I</item> |
|
||||
<item>Φωτονική Τεχνολογία:Φωτονική:Fotoniki</item> |
|
||||
<item>Ψηφιακά Συστήματα I:Ψηφιακά 1:Psifiaka_I</item> |
|
||||
<item>Ψηφιακά Συστήματα II:Ψηφιακά 2:Psifiaka_II</item> |
|
||||
<item>Ψηφιακά Συστήματα III:Ψηφιακά 3:Psifiaka_III</item> |
|
||||
<item>Ψηφιακά Φίλτρα:Φίλτρα:Filtra</item> |
|
||||
<item>Ψηφιακές Τηλεπικοινωνίες I:Ψηφιακές Τηλεπ. 1:Psif_Tilep_I</item> |
|
||||
<item>Ψηφιακές Τηλεπικοινωνίες II:Ψηφιακές Τηλεπ. 2:Psif_Tilep_II</item> |
|
||||
<item>Ψηφιακή Επεξεργασία Εικόνας:ΨΕΕ:PSEE</item> |
|
||||
<item>Ψηφιακή Επεξεργασία Σήματος:ΨΕΣ:PSES</item> |
|
||||
</string-array> |
|
||||
</resources> |
|
@ -0,0 +1,42 @@ |
|||||
|
package gr.thmmy.mthmmy.utils; |
||||
|
|
||||
|
import net.lachlanmckee.timberjunit.TimberTestRule; |
||||
|
|
||||
|
import org.json.JSONObject; |
||||
|
import org.junit.Rule; |
||||
|
import org.junit.Test; |
||||
|
import org.junit.runner.RunWith; |
||||
|
import org.powermock.core.classloader.annotations.PrepareForTest; |
||||
|
import org.powermock.modules.junit4.PowerMockRunner; |
||||
|
|
||||
|
import java.io.InputStream; |
||||
|
import java.util.HashMap; |
||||
|
|
||||
|
import gr.thmmy.mthmmy.activities.upload.UploadsCourse; |
||||
|
import gr.thmmy.mthmmy.utils.io.ResourceUtils; |
||||
|
|
||||
|
import static gr.thmmy.mthmmy.activities.upload.UploadsCourse.generateCoursesFromJSON; |
||||
|
import static org.junit.Assert.assertEquals; |
||||
|
import static org.junit.Assert.assertNotNull; |
||||
|
import static org.junit.Assert.assertTrue; |
||||
|
|
||||
|
@RunWith(PowerMockRunner.class) |
||||
|
@PrepareForTest(JSONObject.class) |
||||
|
public class UploadsCoursesJSONReadingTest { |
||||
|
private final String filePath = "uploads_courses.json"; |
||||
|
|
||||
|
@Rule |
||||
|
public TimberTestRule logAllAlwaysRule = TimberTestRule.logAllAlways(); |
||||
|
|
||||
|
@Test |
||||
|
public void uploadsCoursesRetrievedCorrectly() throws Exception { |
||||
|
InputStream is = this.getClass().getClassLoader().getResourceAsStream(filePath); |
||||
|
assertNotNull(is); |
||||
|
String uploadsCoursesJSON = ResourceUtils.readJSONResourceToString(is); |
||||
|
assertNotNull(uploadsCoursesJSON);; |
||||
|
JSONObject jsonObject = new JSONObject(uploadsCoursesJSON); |
||||
|
assertTrue(jsonObject.has("categories")); |
||||
|
HashMap<Integer, UploadsCourse> coursesHashMap = generateCoursesFromJSON(jsonObject); |
||||
|
assertEquals(coursesHashMap.size(), 216); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue